J'ai un certificat d'entité finale/serveur qui a un certificat intermédiaire et racine. Lorsque je cat
sur le certificat d'entité finale, je ne vois qu'une seule balise BEGIN
et END
. C'est le seul certificat d'entité finale.
Existe-t-il un moyen de visualiser le contenu du certificat intermédiaire et racine. Je n'ai besoin que du contenu des balises BEGIN
et END
.
Sous Windows, je peux voir la chaîne de certificats complète à partir du "Chemin de certification". Voici l'exemple du certificat de Stack Exchange.
De là, je peux effectuer un Afficher le certificat et les exporter. Je peux le faire à la fois pour root et intermédiaire dans Windows. Je recherche cette même méthode sous Linux.
À partir d'un site Web, vous pouvez faire:
openssl s_client -showcerts -verify 5 -connect stackexchange.com:443 < /dev/null
Cela montrera la chaîne de certificats et tous les certificats présentés par le serveur.
Maintenant, si j'enregistre ces deux certificats dans des fichiers, je peux utiliser openssl verify
:
$ openssl verify -show_chain -untrusted dc-sha2.crt se.crt
se.crt: OK
Chain:
depth=0: C = US, ST = NY, L = New York, O = "Stack Exchange, Inc.", CN = *.stackexchange.com (untrusted)
depth=1: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert SHA2 High Assurance Server CA (untrusted)
depth=2: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert High Assurance EV Root CA
Le -untrusted
option est utilisée pour donner le ou les certificats intermédiaires; se.crt
est le certificat à vérifier. Le résultat depth = 2 provenait du magasin CA de confiance du système.
Si vous ne disposez pas du ou des certificats intermédiaires, vous ne pouvez pas effectuer la vérification. Voilà comment fonctionne X.509.
Selon le certificat, il peut contenir un URI pour obtenir l'intermédiaire. Par exemple, openssl x509 -in se.crt -noout -text
contient:
Authority Information Access:
OCSP - URI:http://ocsp.digicert.com
CA Issuers - URI:http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt
Cet URI "CA Issuers" pointe vers le certificat intermédiaire (au format DER, vous devez donc utiliser openssl x509 -inform der -in DigiCertSHA2HighAssuranceServerCA.crt -out DigiCertSHA2HighAssuranceServerCA.pem
pour le convertir pour une utilisation ultérieure par OpenSSL).
Si vous exécutez openssl x509 -in /tmp/DigiCertSHA2HighAssuranceServerCA.pem -noout -issuer_hash
vous obtenez 244b5494
, que vous pouvez rechercher dans le magasin de l'autorité de certification racine du système à /etc/ssl/certs/244b5494.0
(ajoutez simplement .0
au nom).
Je ne pense pas qu'il existe une commande OpenSSL agréable et facile à faire tout cela pour vous.
tl; dr - un liner bash magic pour vider tous les certificats de la chaîne
openssl s_client -showcerts -verify 5 -connect de.wikipedia.org:443 < /dev/null | awk '/BEGIN/,/END/{ if(/BEGIN/){a++}; out="cert"a".crt"; print >out}' && for cert in *.crt; do newname=$(openssl x509 -noout -subject -in $cert | sed -n 's/^.*CN=\(.*\)$/\1/; s/[ ,.*]/_/g; s/__/_/g; s/^_//g;p').pem; mv $cert $newname; done
Explication en 2 étapes
Pour vider tous les certificats de la chaîne dans le répertoire actuel sous la forme cert${chain_number}.pem
:
openssl s_client -showcerts -verify 5 -connect your_Host:443 < /dev/null | awk '/BEGIN/,/END/{ if(/BEGIN/){a++}; out="cert"a".pem"; print >out}'
bonus-track pour les renommer en leur nom commun:
for cert in *.pem; do newname=$(openssl x509 -noout -subject -in $cert | sed -n 's/^.*CN=\(.*\)$/\1/; s/[ ,.*]/_/g; s/__/_/g; s/^_//g;p').pem; mv $cert $newname; done
J'ai découvert qu'avec l'option -verify 5
openssl va profondément dans la chaîne en montrant tous les certificats, même ceux qui ne sont pas inclus dans le déploiement de votre certificat.
Si vous voulez vraiment comprendre quelle chaîne est fournie avec votre certificat, vous devez exécuter:
openssl s_client -showcerts -partial_chain -connect YOUR_ENDPOINT:443 < /dev/null |less