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

25

J'ai un certificat d'entité finale / serveur qui a un certificat intermédiaire et racine. Lorsque je suis catsur le certificat d'entité finale, je ne vois qu'un seul BEGINet une ENDbalise. 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 BEGINet de la ENDbalise.

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.

entrez la description de l'image ici

De là, je peux effectuer un certificat de vue 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.

entrez la description de l'image ici

Anirban Nag 'tintinmj'
la source
Veuillez nous indiquer qui vous a délivré ce certificat.
Rui F Ribeiro
@RuiFRibeiro Disons que n'importe qui ... Je veux voir la chaîne de certificats pour stackexchange avec seulement le certificat principal en main.
Anirban Nag 'tintinmj'

Réponses:

25

À 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

L' -untrustedoption est utilisée pour donner le ou les certificats intermédiaires; se.crtest 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. À titre d'exemple, openssl x509 -in se.crt -noout -textcontient:

        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_hashvous obtenez 244b5494, que vous pouvez rechercher dans le magasin racine de l'autorité de certification système /etc/ssl/certs/244b5494.0(ajoutez simplement .0le nom).

Je ne pense pas qu'il existe une commande OpenSSL simple et agréable pour faire tout cela pour vous.

derobert
la source
Voilà le principal problème. Je n'ai pas l'URL avec moi. Je n'ai que le fichier de certificat. Et j'ai besoin du contenu crypté entre BEGINet ENDtag (que vous obtiendrez juste après avoir cating le fichier .crt.
Anirban Nag 'tintinmj'
@ AnirbanNag'tintinmj 'Si vous cherchez simplement à décoder le certificat, essayezopenssl x509 -in file.crt -noout -text
derobert
Je veux le contenu du certificat intermédiaire à la racine qui se trouve entre la balise BEGINet END.
Anirban Nag 'tintinmj'
Ou si vous pouvez donner une commande qui extraira le certificat intermédiaire et racine du certificat principal et l'enregistrera dans un fichier ... Je peux vivre avec ça aussi.
Anirban Nag 'tintinmj'
@ AnirbanNag'tintinmj 'S'il ne s'affiche pas avec la openssl x509commande, je ne pense pas que le certificat intermédiaire soit là. (Sauf si vous avez obtenu une erreur openssl x509).
derobert
12

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
estani
la source
Y a-t-il une raison de choisir ".pem" contre ".crt" comme extension puisque vous ne les renommez que, sans changer le format?
Captain Man
Non, pas vraiment. ".pem" est le format (base64 du DER) ".crt" signifie que c'est un certificat mais ne dit rien sur l'encodage. J'étais sur le point de le rendre plus cohérent et de nommer tous les pem ... Mais je pense qu'il est plus simple de lire dans la seule ligne pour comprendre où le certificat est téléchargé (crt) et terminer ce que j'utilise généralement dans le monde Linux (pem) . J'espère que cela clarifie un peu les choses ...
estani
1
Oui, je me rends compte que PEM est un format mais je vois souvent crt et je ne savais pas si c'était un format. Cela explique en fait pourquoi je vois "crt" si souvent utilisé. Merci :)
Captain Man
Cela ne semble fonctionner que si vous faites déjà confiance à la source. J'essaie de télécharger une autorité de certification personnalisée, mais elle ne télécharge que le premier certificat, pas la chaîne.
mjaggard
@mjaggard étrange puisque je l'ai utilisé exactement pour ce cas. Cela étant dit, le serveur n'envoie peut-être pas du tout l'autorité de certification racine, si vous regardez mon exemple, il téléchargeait 3 certificats maintenant, il n'en télécharge que 2. Je suppose que le serveur wikipedia n'envoie pas la racine (il n'y a vraiment pas de point, si vous ne l'avez pas, vous ne lui ferez pas confiance de toute façon ...). Je suis sûr que ce n'était pas le cas auparavant.
estani