web-dev-qa-db-fra.com

Comment extraire l'autorité de certification racine et l'autorité de certification secondaire d'une chaîne de certificats sous Linux?

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.

enter image description here

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.

enter image description here

30

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

32
derobert

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
22
estani

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
1
Alex