J'ai créé une clé et un CSR sur la console à l'aide de l'exécutable openssl. J'ai ensuite envoyé le CSR à une autorité de certification et 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
puis créé un magasin de clés le contenant:
keytool -importkeystore -deststorepass [password] -destkeystore keystore.jks -srckeystore key_and_cert.p12 -srcstoretype PKCS12 -srcstorepass [password]
Ensuite, j'importe le certificat intermédiaire chain.crt:
keytool -import -trustcacerts -alias root -file chain.crt -keystore keystore.jks
Voici la sortie 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]
Le fichier Tomcat server.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]" />
Lorsque je redémarre Tomcat, il ne consigne aucune erreur dans catalina.out, tout semble aller pour le mieux. Mais lorsque je lance Firefox, il indique
[domain] uses an invalid security certificate.
The certificate is not trusted because no issuer chain was provided.
(Error code: sec_error_unknown_issuer)
L'exécution de "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 que Tomcat le livre?
Informations complémentaires: 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 d'abord le certificat intermédiaire, puis d'appeler -importkeystore. J'ai eu les mêmes résultats.
edit: Je viens d'essayer d'une autre manière en insérant la chaîne directement dans le certificat PKCS # 12 et j'obtiens le message d'erreur suivant:
$ 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
Finalement je l'ai fait fonctionner. Ce n'est pas une solution propre, mais cela fonctionne. J'ai ajouté le certificat intermédiaire à mon répertoire local/etc/ssl/certs, puis appelé
openssl pkcs12 -export -in cert.pem -inkey key.key -out key_and_cert.p12 -chain
Le certificat pkcs12 résultant a été 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 fournit également la chaîne de certificats aux clients qui ne possèdent pas le certificat intermédiaire dans leur répertoire/etc/ssl/certs. Mais je pense qu’il doit également y avoir un moyen/etc/ssl/certs.
J'ai dû créer un fichier d'autorité de certification en recherchant le certificat racine de mon émetteur, puis en plaçant le certificat intermédiaire au-dessus de celui-ci dans le même fichier. Puis j'ai couru:
openssl pkcs12 -export -chain -inkey mykey.key -in mye.crt -name "Tomcat" -CA fichier intermédiaire_plus_racine.crt -out key_and_cert.p12
Il existe même une solution plus simple comme demandé dans certains commentaires (sans enregistrer les certificats racine et intermédiaires dans/etc/ssl/certs)
Commencez par copier tous les certificats racine et intermédiaires 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 selon le schéma suivant '{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, continuez avec la commande suivante qui crée votre fichier .p12 en utilisant '-CApath' au lieu de faire un long chemin en copiant les certificats dans/etc/ssl/certs:
openssl pkcs12 -export -in cert.pem -inkey key.key -out key_and_cert.p12 -chain -CApath ~/certs
Enfin, convertissez-le en jks comme 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]
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"
/>
assurez-vous de copier les fichiers openssl ca dans les fichiers intermédiaires.
sur RHEL, concattez le fichier suivant dans votre fichier émetteur ca.
/etc/pki/tls/certs/ca-bundle.crt