tipo seguridad ruta renovar puede instalar crear configurar con claves certificado cargar almacén agregar tomcat https certificate openssl keystore

tomcat - seguridad - no puede cargar almacén de claves de tipo jks con ruta



Tomcat no entrega certificado intermedio(https) (5)

Creé una clave y un csr en la consola, usando el ejecutable de openssl. Luego envié la csr a una CA y obtuve el certificado. Ahora quiero importarlo a tomcat.

Así que creé un archivo PKCS # 12 de mi clave y mi certificado:

openssl pkcs12 -export -in mycert.cert -inkey mykey.pem -out key_and_cert.p12

y luego creó un almacén de claves que lo contiene:

keytool -importkeystore -deststorepass [password] -destkeystore keystore.jks -srckeystore key_and_cert.p12 -srcstoretype PKCS12 -srcstorepass [password]

Luego importo el certificado intermedio chain.crt:

keytool -import -trustcacerts -alias root -file chain.crt -keystore keystore.jks

Aquí el resultado de "keytool -keystore keystore.jks -list":

Keystore-Typ: JKS Keystore-Provider: SUN Ihr Keystore enthält 2 Einträge. root, 14.11.2011, trustedCertEntry, Zertifikatsfingerabdruck (MD5): [fingerprint] 1, 14.11.2011, PrivateKeyEntry, Zertifikatsfingerabdruck (MD5): [fingerprint]

Tomcat server.xml contiene:

<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" URIEncoding="UTF-8" compression="on" sslProtocol="TLS" keystoreFile="/[absolute-path]/keystore.jks" keystorePass="[password]" />

Cuando reinicio tomcat, no registra errores en catalina.out, todo parece estar bien. Pero cuando ejecuto Firefox, informa

[domain] uses an invalid security certificate. The certificate is not trusted because no issuer chain was provided. (Error code: sec_error_unknown_issuer)

Ejecutando "openssl s_client -connect [domain]: 443 -showcerts" regresa

CONNECTED(00000003) depth=0 C = DE, OU = Domain Control Validated, CN = [domain] verify error:num=20:unable to get local issuer certificate verify return:1 depth=0 C = DE, OU = Domain Control Validated, CN = [domain] verify error:num=27:certificate not trusted verify return:1 depth=0 C = DE, OU = Domain Control Validated, CN = [domain] verify error:num=21:unable to verify the first certificate verify return:1 --- Certificate chain 0 s:/C=DE/OU=Domain Control Validated/CN=[domain] i:/C=BE/O=GlobalSign nv-sa/CN=GlobalSign Domain Validation CA - G2 -----BEGIN CERTIFICATE----- [certificate from mycert.cert] -----END CERTIFICATE----- --- Server certificate subject=/C=DE/OU=Domain Control Validated/CN=[domain] issuer=/C=BE/O=GlobalSign nv-sa/CN=GlobalSign Domain Validation CA - G2 --- No client certificate CA names sent --- SSL handshake has read 1777 bytes and written 289 bytes --- New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-SHA Server public key is 2048 bit Secure Renegotiation IS supported Compression: NONE Expansion: NONE SSL-Session: Protocol : SSLv3 Cipher : ECDHE-RSA-AES256-SHA Session-ID: [session-id] Session-ID-ctx: Master-Key: [master-key] Key-Arg : None PSK identity: None PSK identity hint: None Start Time: 1321268519 Timeout : 7200 (sec) Verify return code: 21 (unable to verify the first certificate) ---

Creo que Tomcat no entrega el certificado intermedio aunque lo sepa. ¿Qué puedo hacer para que tomcat lo entregue?

Información adicional: al importar el certificado pkcs12, no hay ningún error en la cadena del certificado, porque el comando -importkeystore no verifica la cadena. También traté de importar primero el certificado intermedio y luego llamar a -importkeystore. Obtuve los mismos resultados.

editar: He intentado de otra manera insertando la cadena directamente en el certificado PKCS # 12 y obtengo el siguiente error:

$ openssl pkcs12 -export -CAfile chain.pem -in mycert.cert -inkey mykey.pem -out key_and_cert.p12 -name tomcat -chain Error unable to get issuer certificate getting chain.

Pero el certificado de la cadena está bien:

$ openssl verify chain.pem chain.pem: OK


Finalmente lo hice funcionar. No es una solución limpia, pero funciona. Agregué el certificado intermedio a mi / etc / ssl / certs local y luego llamé

openssl pkcs12 -export -in cert.pem -inkey key.key -out key_and_cert.p12 -chain

El certificado pkcs12 resultante lo convertí en jks vía

keytool -importkeystore -deststorepass [password] -destkeystore keystore.jks -srckeystore key_and_cert.p12 -srcstoretype PKCS12 -srcstorepass [password]

Este archivo resultante parece funcionar ahora, tomcat entrega la cadena de certificados también a los clientes que no tienen el certificado intermedio en su directorio / etc / ssl / certs. Pero creo que también debe haber una forma sin cambiar / etc / ssl / certs.


Funciona para mí usando APR. Ver http://tomcat.apache.org/tomcat-7.0-doc/config/http.html#SSL_Support_-_APR/Native

<Connector port="3573" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" SSLCertificateFile="/my/pem/encoded/certificate/file" SSLCertificateKeyFile="/my/pem/encoded/certificate/private_key" SSLPassword="yourKeyFilePassword" SSLCertificateChainFile="/my/pem/encoded/certificate/authorities/file" />


Incluso hay una solución más simple como se pide en algunos comentarios (sin guardar certificados raíz e intermedios en / etc / ssl / certs)

Primero copie todos los certificados raíz e intermedios necesarios en una carpeta (en nuestro ejemplo, la carpeta es ''~ / certs'' y nuestros dos certificados se llaman ''PrimaryCA.pem'' y ''SecondaryCA.pem''):

mkdir ~/certs mv PrimaryCA.pem ~/certs/PrimaryCA.pem mv SecondaryCA.pem ~/certs/SecondaryCA.pem

Luego ''c_rehash'' la carpeta:

c_rehash ~/certs

Ahora la carpeta certs contendrá dos nuevos enlaces simbólicos nombrados con respecto al siguiente esquema ''{hash-value}. {N}'' donde {hash-value} es un valor de hash de 8 símbolos y {n} es un entero. Si ese es el caso para usted, continúe con el siguiente comando que crea su .p12 usando ''-CApath'' en lugar de recorrer un largo camino copiando los certificados a / etc / ssl / certs:

openssl pkcs12 -export -in cert.pem -inkey key.key -out key_and_cert.p12 -chain -CApath ~/certs

Finalmente conviértalo a jks como ya describió perfectamente en su respuesta:

keytool -importkeystore -deststorepass [password] -destkeystore keystore.jks -srckeystore key_and_cert.p12 -srcstoretype PKCS12 -srcstorepass [password]


Tuve que crear un archivo CA al encontrar el certificado raíz para mi emisor y luego colocar el certificado intermedio encima en el mismo archivo. Entonces corrí:

openssl pkcs12 -export -chain -inkey mykey.key -in mye.crt -name "tomcat" -CAfile intermediate_plus_root.crt -out key_and_cert.p12


asegúrese de copiar los archivos de openssl ca en los archivos intermedios.

en RHEL concat siguiendo el archivo a su archivo emisor ca.

/etc/pki/tls/certs/ca-bundle.crt