tomcat ne délivre pas de certificat intermédiaire (https)

j'ai créé une clé et un csr sur la console, en utilisant l'exécutable openssl. Puis j'ai envoyé le csr à une AC et j'ai récupéré le certificat. Maintenant, je veux l'importer dans tomcat.

J'ai donc créé un fichier PKCS#12 à partir de ma clé et de mon certificat:

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

et ensuite créé un fichier de clés contenant:

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

puis j'importe la chaîne de certificat intermédiaire.crt:

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

Voici la sortie de " keytool-keystore keystore.jks -liste":

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]

Le serveur tomcat.xml contient:

<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]" />

quand je redémarre tomcat, il n'enregistre aucune erreur dans catalina.hors, tout semble ok. Mais quand je dirige firefox, il signale

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

en cours d'Exécution "openssl s_client -connect [domaine]:443 -showcerts" renvoie

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)
---

je pense que tomcat ne délivre pas le certificat intermédiaire bien qu'il le sache. Que puis-je faire pour tomcat livrer?

Supplémentaires information: Lors de l'importation du certificat pkcs12, il n'y a pas d'erreur de chaîne de certificats, car la commande-importkeystore ne vérifie pas la chaîne. J'ai également essayé d'importer le certificat intermédiaire d'abord et ensuite appeler-importkeystore. J'ai obtenu les mêmes résultats.

modifier: J'ai juste essayé une autre façon en insérant la chaîne directement dans le certificat PKCS#12 et j'ai eu l'erreur suivante:

$ 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.

mais le certificat de chaîne est ok:

$ openssl verify chain.pem
chain.pem: OK
24
demandé sur Heinzi 2011-11-14 15:08:24

5 réponses

j'ai dû créer un fichier CA en trouvant le cert racine pour mon émetteur et en mettant le cert intermédiaire au-dessus de lui dans le même fichier. Ensuite, j'ai couru:

openssl pkcs12 -export -chain -inkey mykey.key -in mye.crt -name "tomcat" -CAfile intermediate_plus_root.crt -out key_and_cert.p12
12
répondu juanenrique 2012-01-10 00:51:41

il y a même une solution plus simple comme demandé dans certains commentaires (sans enregistrer les certs racine et intermédiaire dans / etc / ssl / certs)

copiez D'abord tous les certificats racine et intermédiaire nécessaires dans un dossier (dans notre exemple, le dossier est '~/certs' et nos deux certificats sont nommés 'PrimaryCA.pem ' et ' SecondaryCA.pem'):

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

Puis "c_rehash' le dossier:

c_rehash ~/certs

maintenant le dossier certs contiendra deux nouveaux liens symboliques nommés concernant le suivant le schéma " {valeur de hachage}.{n} ' Où {valeur de hachage} est une valeur de hachage de 8 symboles et {n} est un entier. Si c'est le cas pour vous continuez à la commande suivante qui crée votre .p12 à l'aide de '-CApath " au lieu d'aller le long chemin de ronde, la copie des certificats /etc/ssl/certs:

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

Enfin convertir jks Heinzi déjà parfaitement décrit, dans sa réponse:

keytool -importkeystore -deststorepass [password] -destkeystore keystore.jks -srckeystore key_and_cert.p12 -srcstoretype PKCS12 -srcstorepass [password]
7
répondu Manfred Scheiner 2017-05-23 11:47:11

finalement je l'ai fait marcher. Ce n'est pas une solution propre, mais ça fonctionne. J'ai ajouté le certificat intermédiaire à mon certificat local / etc / ssl / certs et j'ai ensuite appelé

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

le certificat pkcs12 résultant j'ai converti en jks via

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

ce fichier résultant semble fonctionner maintenant, tomcat livre la chaîne de certificats aussi aux clients qui n'ont pas le certificat intermédiaire dans leur répertoire /etc/ssl/certs. Mais je pense qu'il doit aussi être un moyen sans changer / etc/ssl / certs.

6
répondu Heinzi 2011-11-24 16:32:08

cela fonctionne pour moi en utilisant APR. Voir 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
répondu Gaucho 2017-01-26 14:58:23

assurez-vous de copier les fichiers ca d'openssl dans les fichiers intermédiaires.

sur RHEL concat fichier suivant sur votre émetteur ca fichier.

/etc/pki/tls/certs/ca-bundle.crt
0
répondu kavehmb 2016-05-11 03:18:10