Comment télécharger le certificat SSL depuis un site web?

Réponses:

246

Pour télécharger le certificat, vous devez utiliser le client intégré à openssl comme ceci:

echo -n | openssl s_client -connect HOST:PORTNUMBER \
    | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/$SERVERNAME.cert

Cela permettra d'économiser le certificat /tmp/$SERVERNAME.cert.

Vous pouvez utiliser -showcertssi vous souhaitez télécharger tous les certificats de la chaîne. Mais si vous voulez simplement télécharger le certificat de serveur, il n’est pas nécessaire de spécifier-showcerts

echo -n donne une réponse au serveur, pour que la connexion soit libérée

sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'supprime les informations sur la chaîne de certificats et les détails de connexion. C'est le format préféré pour importer le certificat dans d'autres magasins de clés.

Sean Reifschneider
la source
9
comprenez que vous avez non seulement donné une bonne réponse, mais également une explication précise.
Marc le
Affiche -showcerts- t - il aussi le certificat serveur / feuille? Je pensais que seuls les intermédiaires étaient affichés lorsque ce commutateur était inclus.
Mike B
Comme le dit la réponse, s_clientaffiche toujours le certificat de serveur (s’il en existe un, c’est-à-dire que le serveur répond à Hello et ne choisit pas une suite anonyme). -showcertsaffiche tous les certificats reçus, cert serveur, puis intermédiaires et / ou root.
dave_thompson_085
4
cela ne fonctionne pas en présence d'un proxy, cependant.
Frederick Nord le
2
Cela ne fonctionne pas non plus avec les serveurs qui utilisent SNI (plusieurs certificats / domaines sur une même adresse IP). Pour éviter les problèmes, spécifiez le paramètre nomserveur openssl: openssl s_client -connect HOST: PORTNUMBER -servername CN
verhage
60

J'ai trouvé la réponse. Openssl le fournit.

openssl s_client -connect $ {REMHOST}: $ {REMPORT}

RainDoctor
la source
2
aussi openssl x509 -text <<EOF cert-text EOFpour voir les détails du certificat
mpapis
2
sudo rm -f cert.pem && sudo echo -n | openssl s_client -connect localhost:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ./cert.pemcourtoisie de serverfault.com/questions/139728/…
pulkitsinghal le
ceci accomplit la même chose et saute le sedhack.
phs
Cela ne fait que vérifier un certificat. Que se passe-t-il si le service fait partie d'un groupe de serveurs dont la charge est équilibrée, chacun ayant un certificat différent, éventuellement signé par une autorité de certification racine différente? Autrement dit, une attaque mitm pourrait laisser cette requête aller sur le site réel, puis diriger les autres requêtes vers ses serveurs. Y at-il des moyens de vérifier cela? Et pour obtenir la liste de tous les certificats d’un domaine?
Jens Timmerman
@JensTimmerman "Ou, en d'autres termes, une attaque mitm pourrait laisser cette requête aller sur le site réel, puis diriger les autres requêtes vers ses serveurs." Cela n'est possible que si l'homme au milieu dispose d'un certificat valide pour le serveur cible (ou si le client est stupide ne vérifie pas le certificat du serveur). Évidemment, si le serveur propose parfois un certificat différent, vous ne pouvez espérer que tous les obtenir éventuellement en répétant les tentatives de connexion.
David Tonhofer
22

L’ outil client GNUTLSgnutls-cli , peut également vous faciliter la tâche:

gnutls-cli --print-cert www.example.com \
        < /dev/null \
        > www.example.com.certs

Le programme est conçu pour fournir un client interactif au site. Vous devez donc lui donner une entrée vide (dans cet exemple, de /dev/null) pour mettre fin à la session interactive.

gros nez
la source
1
comment cela permettrait-il aux utilisateurs de se connecter via un proxy https (configuré à l'échelle du système) et d'imprimer le certificat échangé?
Frédéric Nord
9

Sur la base de @bignose answer, voici une version autonome qui convient bien, par exemple, à une recette de chef:

sudo apt-get install gnutls-bin 
gnutls-cli --print-cert myserver.com </dev/null| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > myserver.crt
sudo cp myserver.crt /usr/local/share/ca-certificates/myserver.crt
sudo update-ca-certificates
ODDsKooL
la source
6
true | openssl s_client -connect google.com:443 2>/dev/null | openssl x509

ce mode de openssl attend stdin, nous le fournissons donc via true |, cela se connecte au serveur spécifié dans le paramètre -connect. 2>/dev/nullélimine les erreurs (facultatif), nous pouvons transmettre la totalité de la sortie à l’analyseur x509, en spécifiant qu’il /dev/stdinfaut utiliser le canal de communication en tant que fichier d’entrée. Et cela ne produira que la partie -----BEGIN CERTIFICATE-----to -----END CERTIFICATE-----de la s_clientsortie. Vous pouvez le rediriger vers un fichier en ajoutant > google.com.pemà la fin de la commande.


Autant que je sache, cela ne vérifie pas la chaîne de certificats, il peut seulement vous indiquer l’identité SSL fournie par le serveur final.

ThorSummoner
la source
2
(1) cela n'améliore pas vraiment les réponses d'il y a 6 ans (2) x509lit stdin par défaut, de sorte qu'il -in /dev/stdinest redondant (3) s_clientvérifie que le certificat de serveur est correctement lié à une ancre de confiance locale (racine) et qu'il n'est pas expiré, mais Supprimé les informations qui indiqueraient cela (4) il ne vérifie PAS la révocation (5) il vérifie le nom dans le certificat de serveur uniquement dans la version 1.0.2, puis pas par défaut (mais vous pouvez facilement le vérifier vous-même en consultant le certificat. par la suite)
dave_thompson_085
@ dave_thompson_085, la question est de savoir comment télécharger le certificat, mais ne pas afficher les informations de la chaîne. J'aime beaucoup le openssl x509 beaucoup mieux que sed dans une autre réponse.
Der_Meister
0

Syntaxe alternative utilisant Ex et substitution de processus:

ex +'/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq > file.crt
Kenorb
la source