Comment vérifier l'empreinte SSL par ligne de commande? (wget, curl,…)

32

Utilisation d'un téléchargeur de site Web en ligne de commande, tel que wget,curl ou tout autre ... Dans un script ...

J'ai les empreintes digitales certifiantes d'un site web SHA-1 et SHA-256. Pour des raisons de sécurité ( 1 ) ( 2 ), je ne souhaite pas utiliser le système public d'autorité de certification SSL. L'empreinte doit être codée en dur.

Une application comme wget peut-elle vérifier l’empreinte SSL?

wget n'a pas une telle fonctionnalité. ( 3 )

Utiliser wget --ca-certificateou curl --cacertje devrais utiliser ma propre autorité de certification locale, ce que j'aimerais éviter, car cela ajoute beaucoup de complexité. C'est aussi très difficile et personne ne l'a jamais fait auparavant. ( 4 )

N'y a-t-il aucun outil, comme
download --tlsv1 --serial-number xx:yy:zz --fingerprint xxyyzz https://site.com?

La solution ne doit bien sûr pas être vulnérable à TOCTOU. ( 5 ) Le MITM pourrait laisser renvoyer une empreinte valide pour la demande du client openssl et altérer la demande wget suivante.

James Mitch
la source
Il faudra probablement faire de la magie OpenSSL telle que: cyberciti.biz/faq/…
Justin Andrusk
Visiteurs: notez que cela a été transféré à l’infosec SE . L'une des réponses a été copiée à partir de là. C'est un comportement mal vu, au fait.
Félix Saparelli

Réponses:

31

La source

Installez le logiciel requis:

apt-get install ca-certificates curl

Téléchargez le certificat SSL public:

openssl s_client -connect torproject.org:443 -CAfile /usr/share/ca-certificates/mozilla/DigiCert_Assured_ID_Root_CA.crt >./x.cert </dev/null

Ou mieux:

echo -n | openssl s_client -connect torproject.org:443 -CAfile /usr/share/ca-certificates/mozilla/DigiCert_Assured_ID_Root_CA.crt | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ./torproject.pem

Obtenir l'empreinte SHA-1:

openssl x509 -noout -in torproject.pem -fingerprint -sha1

Obtenez l'empreinte SHA-256:

openssl x509 -noout -in torproject.pem -fingerprint -sha256

Comparez manuellement les empreintes digitales SHA-1 et SHA-256 avec torproject.org FAQ: SSL .

.

Rendre éventuellement les certificats de certification inutiles à des fins de test. L' utilisation boucle , mais wget a un bug Bug et utilise les fichiers ca-même.

sudo mv /usr/share/ca-certificates /usr/share/ca-certificates_

Télécharger avec curl et le certificat épinglé:

curl --cacert ./torproject.pem https://check.torproject.org/ > check.html
James Mitch
la source
cela ne fonctionne pas en présence d'un proxy, cependant: - /
Frederick Nord le
Veuillez noter que l'option -CAfile est complètement ignorée dans votre exemple.
Lars
11

En tcsh:

echo | openssl s_client -connect host.example.com:443 |& openssl x509 -fingerprint -noout
utilisateur273818
la source
3
travaille dans zsh, devrait également travailler pour bash
numéro5
10

C'est aussi assez:

openssl x509 -fingerprint -in server.crt
rundekugel
la source
Ajout d'une -md5option pour récupérer l'empreinte digitale MD5. -md5ne doit pas mettre entre -inet server.crt.
4

C’est assez facile à faire avec le openssl commande et ses fonctionnalités client.

Le petit script suivant prendra un domaine donné (pas de préfixe https) et une empreinte SHA-1, et se terminera sans erreur (0) si l'empreinte récupérée correspond, mais avec le code de sortie 1 s'il n'y a pas de correspondance. Vous pouvez ensuite l'intégrer à votre script en testant simplement le dernier code de sortie $?:

#! / bin / bash
FPRINT = `echo -n | openssl s_client -connect $ 1: 443 2> / dev / null \ | openssl x509 -noout -fingerprint | cut -f2 -d '=' ` if ["$ 2" = "$ FPRINT"]; puis sortie 0 autre sortie 1 Fi
ish
la source
Il est vulnérable à TOCTOU. [1] Le MITM pourrait laisser renvoyer une empreinte digitale valide pour la demande du client openssl et altérer la demande wget suivante. [1] en.wikipedia.org/wiki/Time_de_check_au_heure_de_use
James Mitch
C'est vrai, en théorie. Il serait assez facile de le modifier wgetet de le compiler avec OpenSSL pour qu’il exécute ce que vous voulez en ligne, mais cela dépasse le cadre d’une réponse AU.
Ish
Alors, pourquoi ne pas utiliser s_client pour récupérer également le document? Quelque chose comme (echo -ne "Host: ${HOST}\n\rGET ${URL}\n\r" && yes) 2>/dev/null | openssl s_client -connect ${HOST}:443devrait fonctionner, non? Eh bien, vous devez séparer les informations de session SSL de la réponse de contenu réelle.
Taneli
3

la source

#!/usr/bin/perl
# https://security.stackexchange.com/questions/20399/how-to-verify-the-ssl-fingerprint-by-command-line-wget-curl
# Code snippets taken from Net::SSLeay documentation and mildly modified.
# Requires a newer version of SSLeay (tested with 1.48)
# Needless to say, verify correct $host and $fingerprint before testing!!!

use Net::SSLeay qw(get_https3);

$host = "www.google.com";
$port = 443;
$fingerprint = "C1:95:6D:C8:A7:DF:B2:A5:A5:69:34:DA:09:77:8E:3A:11:02:33:58";

($p, $resp, $hdrs, $server_cert) = get_https3($host, $port, '/');
if (!defined($server_cert) || ($server_cert == 0)) {
    warn "Subject Name: undefined, Issuer  Name: undefined";
} elsif (Net::SSLeay::X509_get_fingerprint($server_cert, "sha1") ne $fingerprint) {
    warn 'Invalid certificate fingerprint '
        .  Net::SSLeay::X509_get_fingerprint($server_cert, "sha1")
        . ' for ' . Net::SSLeay::X509_NAME_oneline(
             Net::SSLeay::X509_get_subject_name($server_cert));
} else {
    print $p;
}

Comme indiqué dans la documentation Net :: SSLeay, cette méthode implique une vérification après la transaction HTTP et ne doit donc pas être utilisée si vous souhaitez vérifier que vous communiquez avec le bon serveur avant de leur envoyer des données. Mais si tout ce que vous faites est de décider s'il faut ou non faire confiance à ce que vous venez de télécharger (cela ressemble à de votre référence 4), c'est très bien.

James Mitch
la source
1

C'est mon script de tous les jours:

curl --insecure -v https://www.google.com 2>&1 | awk 'BEGIN { cert=0 } /^\* Server certificate:/ { cert=1 } /^\*/ { if (cert) print }'

Ouput:

* Server certificate:
*    subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=www.google.com
*    start date: 2016-01-07 11:34:33 GMT
*    expire date: 2016-04-06 00:00:00 GMT
*    issuer: C=US; O=Google Inc; CN=Google Internet Authority G2
*    SSL certificate verify ok.
* Server GFE/2.0 is not blacklisted
* Connection #0 to host www.google.com left intact
Antonio Feitosa
la source