tomcat no entregar el certificado intermedio (https)

He creado una clave y una de la rse en la consola, usando openssl ejecutable.
Luego me envió a la rse a una CA y obtuvo el certificado de la espalda. Ahora quiero importar en tomcat.

Así que he creado un archivo PKCS#12 fuera de mi clave y mi certificado:

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

y, a continuación, crea un almacén de claves que contiene es:

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

A continuación, importar el certificado intermedio de la cadena.crt:

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

Aquí la salida de «keytool-almacén de claves del almacén de claves.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]

El 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 yo reiniciar tomcat, registra ningún error en catalina.fuera, todo parece estar ok.
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)

La ejecución de «openssl s_client -connect [dominio]:443 -showcerts» devuelve

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 entregar el certificado intermedio aunque se sabe. ¿Qué puedo hacer para que tomcat entregar?

Información adicional:
Al importar el certificado pkcs12, no hay ningún certificado de la cadena de error, porque el-importkeystore comando no comprueba la cadena. También he intentado importar el certificado intermedio primero y luego llamar -importkeystore. Tengo los mismos resultados.

editar:
Acabo de intentar otra forma mediante la inserción de la cadena directamente en el archivo PKCS#12 certificado y sale 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 la cadena de certificados es aceptar:

$ openssl verify chain.pem
chain.pem: OK
  • ¿tiene la CA raíz de su cadena de PEM ?
  • lo que le da «openssl verificar -CAfile de la cadena.pem mycert.cert» ?
InformationsquelleAutor Heinzi | 2011-11-14

5 Kommentare

  1. 13

    Tuve que crear un archivo de CA por encontrar la raíz del cert para mi emisor y, a continuación, poner el intermedio cert por encima de él en el mismo archivo. Entonces me encontré:

    openssl pkcs12 -exportación -cadena -inkey mykey.clave -en mye.crt -nombre "tomcat" -CAfile intermediate_plus_root.crt -out key_and_cert.p12 
    
    • He utilizado este método, pero tengo un error: «Error no se puede obtener el certificado de emisor llegar cadena». Así que he seguido algunos de los consejos que he encontrado en la red y lo hizo: gato PrimaryCA.pem /etc/ssl/certs/ca-certificados.crt SecondaryCA.pem > intermediate_plus_root.crt. volvimos a la anterior y que se solucionó el problema.
  2. 8

    Incluso hay una forma más simple de solución como se pidió en algunos comentarios (sin guardar la raíz y el intermedio certs en /etc/ssl/certs)

    Primera copia todos los de la raíz y de los certificados intermedios en una carpeta (en nuestro ejemplo, la carpeta es ‘~/certs’ y nuestros dos certificados se denomina ‘PrimaryCA.pem’ y ‘SecondaryCA.pem’):

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

    A continuación, ‘c_rehash’ la carpeta:

    c_rehash ~/certs
    

    Ahora los certs carpeta contendrá dos nuevos enlaces simbólicos nombre sobre el esquema siguiente ‘{hash-valor}.{n}’ donde {hash-valor} es un 8 símbolo valor de hash y {n} es un número entero. Si ese es el caso para continuar con el siguiente comando, que crea su .p12 usando ‘-CApath’ en lugar de ir por el camino largo de la ronda de la copia de los certificados a /etc/ssl/certs:

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

    Finalmente convertir a jks como Heinzi ya descrito perfectamente en su respuesta:

    keytool -importkeystore -deststorepass [password] -destkeystore keystore.jks -srckeystore key_and_cert.p12 -srcstoretype PKCS12 -srcstorepass [password]
    
    • Me gustaría añadir que usted necesita para cambiar el nombre del certificado en el interior de archivo P12 para ‘tomcat’. Iy tenía nombre de ‘1’ en el interior. Yo solía keystore-explorer.org/downloads.html para que.
    • De otro lado se puede especificar que como openssl parámetro: openssl pkcs12 -export -name "tomcat" -in cert.pem -inkey key.key -out key_and_cert.p12 -chain -CApath ~/certs
  3. 6

    Finalmente yo tengo trabajo. No es una solución limpia, pero funciona. He añadido el certificado intermedio a mi local /etc/ssl/certs y, a continuación, llama

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

    La resultante de certificado pkcs12 me he convertido a jks a través de

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

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

    • le sucede que se han encontrado una solución de limpieza para esto? Tengo un problema similar.
    • lamentablemente no se puede eliminar el certificado de /etc/ssl/certs después
    • ok gracias por este consejo (que en realidad terminó dándose cuenta de que la cadena que me dieron fue de alguna manera incompleto)
    • Tenga en cuenta que usted puede utilizar un archivo PKCS#12 (.p12) archivo directamente como un almacén de claves en Java: el uso de la PKCS12 tipo de almacén (keystoreType="PKCS12" en tu Apache Tomcat configuración del conector).
    • Tenga en cuenta que el comando openssl debe ser suministrado con una exportación de la contraseña, ya sea cuando se le solicite, o con la passout argumento, como el siguiente comando keytool no funcionará con un espacio en blanco srcstorepass.
    • Me di cuenta de que necesitaba agregar -certfile [intermediate cert] a la pkcs12 -export comando. De esa manera, tengo mi propio certificado, más el certificado intermedio requerido por algunos clientes.

  4. 6

    A mí me funciona mediante ABR. 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"
                   />
    
  5. 0

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

    en RHEL concat siguiente archivo a su emisor archivo de ca.

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

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea