web-dev-qa-db-fra.com

Ajout d'un certificat intermédiaire à un fichier pkcs12

J'ai un certificat qui a la chaîne de certification suivante: Entrust-> Mon CA-> Mon CA émettrice-> Mon certificat JBoss. Désormais, si j'installe mon certificat sur mon instance JBoss, toute page à laquelle j'accède en cours d'exécution sur cette instance apparaîtra non fiable, car mon autorité de certification émettrice n'est pas reconnue par mon navigateur. Je sais que mon ordinateur possède la clé publique pour le pouvoir de signature Entrust. Comment puis-je installer mon certificat de sorte que tout navigateur puisse voir toute la chaîne de certificats? 

J'ai créé un fichier .pem unique contenant tous les certificats pensant que cela fonctionnerait. Il n'a pas. Quelqu'un peut-il expliquer ce que je fais mal ou même si cela est possible? 

16
blackirishman

Ajouter un certificat intermédiaire à un fichier pkcs12 ...

Voici comment je le fais sur mes serveurs Web et de messagerie.

Tout d'abord, www-example-com.crt est le certificat de serveur Web signé par Startcom. Startcom propose des certificats gratuits de classe 1 qui font confiance à la plupart des navigateurs et des appareils mobiles. Je les utilise donc. Le certificat est au format PEM (----- BEGIN CERT ----- et ----- END CERT -----).

Deuxièmement, j'ouvre www-example-com.crt et j'ajoute la classe 1 intermédiaire de Startcom. Je reçois l’intermédiaire auprès de Startcom Index of/certs . Maintenant, mon www-example-com.crt contient deux certificats encodés PEM.

Troisièmement, j’effectue les opérations suivantes pour créer un fichier PKCS12/PFX à utiliser dans IIS.

openssl pkcs12 -export -in www-example-com.crt -inkey www.example.key -out www-example-com.p12

Dans votre cas, votre www-example-com.crt contiendra au moins trois certificats codés PEM:

----- BEGIN CERT -----
< My JBoss Certificate >
----- END CERT -----

----- BEGIN CERT -----
< My Issuing CA >
----- END CERT -----

----- BEGIN CERT -----
< My CA >
----- END CERT -----

Le troisième certificat de la chaîne - My CA - est facultatif. Vous n'en avez pas besoin si vos clients utilisent My CA comme ancre de confiance. Si vos clients utilisent Entrust comme ancre de confiance, vous devrez l'inclure.

Si vous cat votre www-example-com.crt et qu'il ne PAS possède plusieurs certificats, ne continuez pas. N'exécutez pas openssl pkcs12 tant que votre certificat de serveur ne dispose pas de tous les certificats intermédiaires requis pour vérifier la chaîne.

N'incluez pas le certificat Entrust CA.


Je doute qu'Entrust signe directement avec son autorité de certification. Ils utilisent probablement un intermédiaire, aussi. Donc, votre chaîne de certificats devrait probablement ressembler à:

----- BEGIN CERT -----
< My JBoss Certificate >
----- END CERT -----

----- BEGIN CERT -----
< My Issuing CA >
----- END CERT -----

----- BEGIN CERT -----
< My CA >
----- END CERT -----

----- BEGIN CERT -----
< Entrust Intermediate >
----- END CERT -----

Entrusts fournit leurs certificats de CA et intermédiaires à Certificats racine Entrust . Je ne peux pas vous dire lequel vous avez besoin, car vous ne fournirez pas d'URL ni nous montrerez la chaîne que vous avez. Mais je suppose que ça va être un ou plusieurs de:

  • Certificat de chaîne Entrust L1E
  • Certificat de chaîne Entrust L1C
  • Certificat de chaîne Entrust L1E (SHA2)
  • Certificat de chaîne Entrust L1C (SHA2)

Vous pouvez tester votre chaîne avec le `s_client d'OpenSSL. Cette fois-ci, vous utiliserez le certificat Entrust:

echo -e "GET / HTTP/1.0\r\n" | openssl s_client -connect myserver:8443 \
                                       -CAfile entrust-ca.pem

Vous pouvez obtenir entrust-ca.pem à partir de Certificats racine Entrust . Exécutez-le et dites-nous quelles erreurs vous obtenez. Ou mieux, postez l'URL sur votre serveur afin que nous puissions voir ce qui se passe.

21
jww

J'ai un certificat qui a la chaîne de certification suivante: Entrust-> Mon CA-> Mon CA émetteur-> Mon certificat JBoss ....

Je pense que vous avez deux problèmes ici. Le premier est l'autorité de certification contresignée et le second est une chaîne de clients incomplète.

Tout d'abord, le problème facile. Le serveur doit envoyer le cert de l'entité finale (serveur) et tous les certificats intermédiaires à la construction requise de la chaîne. Le serveur envoie les certificats intermédiaires pour éviter le problème "quel répertoire". Le "quel répertoire" est un problème bien connu dans PKI. Essentiellement, le client ne sait pas où aller pour récupérer le certificat intermédiaire manquant.

Votre première solution consiste donc pour le serveur à envoyer une chaîne avec:

  • Votre certificat intermédiaire ('Mon AC émettrice')
  • Votre certificat de serveur ('Mon certificat JBoss')

Deuxièmement, vous avez le problème d'un émetteur non fiable. Le client doit faire confiance à votre autorité de certification émettrice interne.

Votre deuxième solution consiste donc à vous assurer que votre client fait confiance à votre autorité de certification interne ("Mon autorité de certification"). Dans ce cas, le client n'a même pas besoin d'utiliser Entrust puisque le point de confiance est enraciné dans votre autorité de certification interne.

Il est possible que le serveur envoie une chaîne avec «Mon CA», «Mon CA émettrice» et «Mon certificat JBoss». Dans ce cas, le client doit faire confiance à «Entrust».

Si le client ne fait pas confiance à «Entrust» ou à «Mon autorité de certification», vous obtiendrez des erreurs de vérification.


J'ai créé un fichier .pem unique contenant tous les certificats pensant que cela fonctionnerait. Il n'a pas. Quelqu'un peut-il expliquer ce que je fais mal ou même si cela est possible? 

Dans ce cas, nous aurions besoin de voir les certificats afin de savoir ce qui se passe. Pouvez-vous publier une URL qui sert le certificat et utilise la chaîne; et publiez-vous votre certificat interne de CA ('Mon CA') en ligne?

Voici un moyen rapide et sale de tester une connexion avec le s_client d'OpenSSL:

echo -e "GET / HTTP/1.0\r\n" | openssl s_client -connect myserver:8443 \
                                       -CAfile my-issuing-ca.pem

OpenSSL ne fait confiance à rien par défaut (contrairement aux navigateurs), vous devez donc spécifier votre ancre de confiance avec -CAfile.

Cette commande devrait se terminer par quelque chose de similaire au suivant.

SSL-Session:
    Protocol  : TLSv1
    Cipher    : DHE-RSA-AES256-SHA
    Session-ID: 37E5AF0EE1745AB2...
    Session-ID-ctx:
    Master-Key: 7B9F8A79D3CC3A41...
    Key-Arg   : None
    Start Time: 1243051912
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)

Si la commande OpenSSL aboutit à OK, le problème vient du navigateur et du point de confiance.

0
jww