Je construis ma propre chaîne de certificats avec les composants suivants:
Root Certificate - Intermediate Certificate - User Certificate
Le certificat racine est un certificat auto-signé, le certificat intermédiaire est signé par la racine et l'utilisateur par l'intermédiaire.
Maintenant, je veux vérifier si un certificat utilisateur a son ancre par certificat racine.
Avec
openssl verify -verbose -CAfile RootCert.pem Intermediate.pem
la validation est ok. À l'étape suivante, je valide le certificat d'utilisateur avec
openssl verify -verbose -CAfile Intermediate.pem UserCert.pem
et la validation montre
error 20 at 0 depth lookup:unable to get local issuer certificate
Qu'est-ce qui ne va pas?
la source
man verify
, j'ai trouvé que le-untrusted
paramètre est le bon à utiliser lors de la spécification du certificat intermédiaire.-untrusted
ne vérifie pas si la chaîne de certificats est entièrement valide. Veuillez envisager de passer à la fois intermédiaire et racine à la commande comme-CAfile
le suggèrent d'autres questions.openssl verify -CAfile /usr/local/etc/openssl/cert.pem -untrusted Intermediate.pem UserCert.pem
C'est l'un des rares emplois légitimes pour
cat
:Mettre à jour:
Comme Greg Smethells le souligne dans les commentaires, cette commande fait implicitement confiance à Intermediate.pem . Je recommande de lire la première partie des références post Greg (la deuxième partie concerne spécifiquement pyOpenSSL et n'est pas pertinente pour cette question).
Au cas où le message disparaît, je citerai les paragraphes importants:
Il semble qu'openssl arrêtera de vérifier la chaîne dès qu'un certificat racine est rencontré, qui peut également être Intermediate.pem s'il est auto-signé. Dans ce cas, RootCert.pem n'est pas pris en compte. Assurez-vous donc que Intermediate.pem provient d'une source fiable avant de vous fier à la commande ci-dessus.
la source
Le problème est que
openssl -verify
cela ne fait pas le travail.Comme Priyadi l'a mentionné ,
openssl -verify
s'arrête au premier certificat auto-signé, donc vous ne vérifiez pas vraiment la chaîne, car souvent le certificat intermédiaire est auto-signé.Veuillez noter que la réponse de Peter est correcte , mais la sortie de
openssl -verify
ne donne aucun indice que tout fonctionne vraiment après. Oui, il peut y avoir des problèmes, mais pas tous.Voici un script qui vérifie une chaîne de certificats avant de l'installer dans Apache. Peut-être que cela peut être amélioré avec certaines des magies les plus mystiques d'OpenSSL, mais je ne suis pas un gourou d'OpenSSL et les œuvres suivantes:
Il y a un GitHub Gist de ceci qui pourrait avoir des mises à jour
Prérequis de ce script:
/etc/ssl/certs
comme d'habitude, par exemple sur UbuntuDIR
lequel vous stockez 3 fichiers:DIR/certificate.crt
qui contient le certificatDIR/certificate.key
qui contient la clé secrète de votre webservice (sans mot de passe)DIR/certificate.bundle
qui contient le CA-Bundle. Pour savoir comment préparer le bundle, voir ci-dessous../check DIR/certificate
(cela suppose que le script est nommécheck
dans le répertoire courant)CA-Bundle is not needed
. Cela signifie que vous (lisez/etc/ssl/certs/
:) fait déjà confiance au certificat de signature. Mais c'est très improbable sur le WWW.Comment créer le
certificate.bundle
fichier?Sur le WWW, la chaîne de confiance ressemble généralement à ceci:
/etc/ssl/certs
certificate.crt
)Maintenant, l'évaluation se déroule de bas en haut, cela signifie d'abord que votre certificat est lu, puis le certificat intermédiaire inconnu est nécessaire, puis peut-être le certificat de signature croisée, puis il
/etc/ssl/certs
est consulté pour trouver le certificat de confiance approprié.Le ca-bundle doit être constitué exactement dans le bon ordre de traitement, cela signifie que le premier certificat nécessaire (le certificat intermédiaire qui signe votre certificat) vient en premier dans le bundle. Ensuite, le certificat de signature croisée est nécessaire.
Habituellement, votre autorité de certification (l'autorité qui a signé votre certificat) fournira déjà un tel fichier ca-bundle approprié. Sinon, vous devez sélectionner tous les certificats intermédiaires nécessaires et
cat
les rassembler dans un seul fichier (sous Unix). Sous Windows, vous pouvez simplement ouvrir un éditeur de texte (commenotepad.exe
) et coller les certificats dans le fichier, le premier nécessaire en haut et en suivant les autres.Il y a autre chose. Les fichiers doivent être au format PEM. Certaines autorités de certification émettent le format DER (un binaire). PEM est facile à repérer: il est lisible en ASCII. Pour en savoir plus sur la façon de convertir quelque chose en PEM, voir Comment convertir .crt en .pem et suivez la route de briques jaunes.
Exemple:
Tu as:
intermediate2.crt
le certificat intermédiaire qui a signé votrecertificate.crt
intermediate1.crt
un autre cert intermédiaire, qui a chantéintermediate2.crt
crossigned.crt
qui est un certificat de signature croisée d'une autre autorité de certification, qui a signéintermediate1.crt
crossintermediate.crt
qui est un autre intermédiaire de l'autre CA qui a signécrossigned.crt
(vous ne verrez probablement jamais une telle chose)Alors le bon
cat
ressemblerait à ceci:Et comment savoir quels fichiers sont nécessaires ou non et dans quel ordre?
Eh bien, expérimentez, jusqu'à ce que
check
vous disiez que tout va bien. C'est comme un jeu de puzzle informatique pour résoudre l'énigme. Chaque. Célibataire. Temps. Même pour les pros. Mais vous vous améliorerez à chaque fois que vous en aurez besoin. Vous n'êtes donc définitivement pas seul avec toute cette douleur. C'est SSL, tu sais? SSL est probablement l'une des pires conceptions que j'ai jamais vues en plus de 30 ans d'administration système professionnelle. Vous êtes-vous déjà demandé pourquoi la cryptographie n'était pas devenue courante au cours des 30 dernières années? C'est pourquoi. dit Nuff.la source
J'ai dû faire une vérification d'un certificat letsencrypt et je l'ai fait comme ceci:
Émettez cette commande:
la source
Après avoir passé une journée entière sur le même problème, sans aucune connaissance préalable des certificats SSL, j'ai téléchargé le gestionnaire de fichiers de clés CERTivity et y ai importé mon magasin de clés , et j'ai obtenu une visualisation claire de la chaîne de certificats.
Capture d'écran :
la source
openssl verify
.Si vous souhaitez uniquement vérifier que l' émetteur de
UserCert.pem
est réellement,Intermediate.pem
procédez comme suit (l'exemple utilise:)OpenSSL 1.1.1
:et vous obtiendrez:
ou
la source
openssl verify -no-CAfile -no-CApath -partial_chain -trusted Intermediate.pem UserCert.pem
Python 3.7?Vous pouvez facilement vérifier une chaîne de certificats avec openssl. La chaîne complète comprendra le certificat de l'autorité de certification, vous devriez donc voir les détails sur l'autorité de certification et le certificat lui-même.
openssl x509 -in fullchain.pem -text -noout
la source