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


Je veux télécharger le certificat SSL de, disons https://www.google.com, en utilisant wget ou d’autres commandes. Une ligne de commande unix? wget ou openssl?


162
2018-05-07 21:01


origine




Réponses:


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 -showcerts si vous souhaitez télécharger tous les certificats de la chaîne. Mais si vous souhaitez 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.


219
2017-10-19 22:59



comprenez que vous avez non seulement donné une bonne réponse, mais également une explication précise. - marco.m
Est-ce que -showcerts montrer le certificat serveur / feuille aussi? Je pensais que seuls les intermédiaires étaient affichés lorsque cet interrupteur était inclus. - Mike B
Comme dit la réponse, s_client affiche 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). -showcerts spectacles tout les certificats reçus, cert du serveur d'abord, puis intermédiaires et / ou root. - dave_thompson_085
cela ne fonctionne pas en présence d'un proxy, cependant. - Frederick Nord
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


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

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


54
2018-05-07 21:05



également openssl x509 -text <<EOF cert-text EOF pour voir les détails du certificat - mpapis
sudo rm -f cert.pem && sudo echo -n | openssl s_client -connect localhost:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ./cert.pem courtoisie de serverfault.com/questions/139728/… - pulkitsinghal
ce accomplit la même chose et saute la sed pirater. - phs
Cela ne fait que vérifier un certificat, que se passe-t-il si le service fait partie d'un groupe de serveurs à charge équilibrée, chacun d'eux 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 demande aller au fond du site réel, puis diriger les autres demandes 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


le GNUTLS outil client, gnutls-cli, peut aussi rendre cela facile:

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 terminer la session interactive.


20
2017-10-07 06:19



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é? - Frederick Nord


Sur la base de @bignose answer, voici une version autonome qui s’intègre 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

8
2018-05-27 09:31





true | openssl s_client -connect google.com:443 2>/dev/null | openssl x509

ce mode d’openssl attend stdin, nous le fournissons donc via true |, ceci 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 /dev/stdin utiliser le shell pipe comme fichier d'entrée. Et cela ne produira que le -----BEGIN CERTIFICATE----- à -----END CERTIFICATE----- partie de la s_client sortie. 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 uniquement vous indiquer l’identité SSL fournie par le serveur final.


6
2018-01-12 10:38



(1) cela n'améliore pas vraiment les réponses d'il y a 6 ans (2) x509 lit stdin par défaut afin -in /dev/stdin est redondant (3) s_client vérifie que le certificat de serveur est lié correctement à une ancre de confiance locale (racine) et qu'il n'est pas expiré, mais vous avez supprimé les informations qui indiqueraient que cela (4) il NE vérifie PAS la révocation (5), il vérifie la prénom dans le certificat de serveur uniquement dans la version 1.0.2 et 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


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

0