Come verificare l'impronta digitale SSL dalla riga di comando? (wget, curl, ...)


32

Utilizzando un sito web downloader riga di comando, come ad esempio wget, curlo di qualsiasi altro ... In uno script ...

Ho l'impronta digitale certificata SHA-1 e SHA-256 di un sito Web. Per motivi di sicurezza ( 1 ) ( 2 ), non desidero utilizzare il sistema pubblico di autorità di certificazione SSL. L'impronta digitale deve essere codificata.

Un'applicazione come wget può controllare l'impronta digitale SSL?

wget non ha una tale funzionalità. ( 3 )

Utilizzando wget --ca-certificateo curl --cacertavrei dovuto eseguire la mia autorità di certificazione locale, che vorrei impedire, perché aggiunge molta complessità. È anche ultra difficile e nessuno lo ha mai fatto prima. ( 4 )

Non c'è qualche strumento, come
download --tlsv1 --serial-number xx:yy:zz --fingerprint xxyyzz https://site.com?

Naturalmente la soluzione non deve essere vulnerabile a TOCTOU. ( 5 ) Il MITM potrebbe lasciare restituire un'impronta digitale valida per la richiesta del client openssl e manomettere la seguente richiesta di wget.


Probabilmente devi fare un po 'di magia OpenSSL come: cyberciti.biz/faq/…
Justin Andrusk,

Visitatori: si noti che questo è stato inviato per posta incrociata all'IS infosec . Una delle risposte di sé è stata copiata da lì. Questo è un comportamento malvisto, tra l'altro.
Félix Saparelli,

Risposte:


31

fonte

Installa il software richiesto:

apt-get install ca-certificates curl

Scarica il certificato SSL pubblico:

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

O meglio:

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

Ottieni l'impronta digitale SHA-1:

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

Ottieni l'impronta digitale SHA-256:

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

Confronta manualmente le impronte digitali SHA-1 e SHA-256 con FAQ di torproject.org: SSL .

.

Facoltativamente, rendere i certificati ca inutili ai fini del test. Usando curl qui, ma wget ha un bug Bug e usa comunque i file ca.

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

Download con arricciatura e certificato appuntato:

curl --cacert ./torproject.pem https://check.torproject.org/ > check.html

questo non funziona in presenza di un proxy, però: - /
Frederick Nord

Nota che l'opzione -CAfile è completamente ignorata nel tuo esempio.
Lars,

11

In tcsh:

echo | openssl s_client -connect host.example.com:443 |& openssl x509 -fingerprint -noout

3
funziona zsh, dovrebbe funzionare anche per bash
5

10

Questo è anche abbastanza:

openssl x509 -fingerprint -in server.crt

Aggiungi -md5opzione per recuperare MD5 Fingerprint. -md5non deve essere inserito tra -ine server.crt.
皞 皞

4

Questo è abbastanza facile da fare con il opensslcomando e la sua funzionalità client.

Il seguente piccolo script prenderà un determinato dominio (senza prefisso https) e un'impronta digitale SHA-1 e uscirà senza errori (0) se l'impronta digitale recuperata corrisponde, ma con il codice di uscita 1 se non vi è corrispondenza. Puoi quindi incorporarlo nel tuo script semplicemente testando l'ultimo codice di uscita $?:

#! / Bin / bash
FPRINT = `echo -n | openssl s_client -connect $ 1: 443 2> / dev / null \ | openssl x509 -noout -fingerprint | cut -f2 -d '=' ` if ["$ 2" = "$ FPRINT"]; poi uscita 0 altro uscita 1 fi

È vulnerabile a TOCTOU. [1] Il MITM ha potuto restituire un'impronta digitale valida per la richiesta del client openssl e manomettere la seguente richiesta di wget. [1] en.wikipedia.org/wiki/Time_of_check_to_time_of_use
James Mitch

Vero, in teoria. Sarebbe abbastanza facile modificarlo wgete compilarlo con OpenSSL in modo che esegua ciò che si desidera in linea, ma questo va oltre lo scopo di una risposta AU.
Ish,

Quindi, che ne dici di usare s_client per recuperare anche il documento? Qualcosa del genere (echo -ne "Host: ${HOST}\n\rGET ${URL}\n\r" && yes) 2>/dev/null | openssl s_client -connect ${HOST}:443dovrebbe funzionare, no? Bene, devi dividere le informazioni sulla sessione SSL dalla risposta del contenuto effettivo.
Taneli,

3

fonte

#!/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;
}

Come indicato nella documentazione di Net :: SSLeay, questo metodo significa verifica dopo la transazione HTTP e quindi non dovrebbe essere usato se si desidera verificare che si sta parlando con il server giusto prima di inviare loro i dati. Ma se tutto ciò che stai facendo è decidere se fidarti o meno di ciò che hai appena scaricato (il che è come se fossi dal tuo riferimento n. 4), va bene.


1

Questa è la mia sceneggiatura quotidiana:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.