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

5

Utilizzo di un downloader del sito Web da riga di comando, ad esempio wget , curl o qualsiasi altro ... In uno script ...

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

Può un'applicazione wget come controllare l'impronta digitale SSL?

wget non ha tale funzionalità. ( 3 )

Usare wget --ca-certificate o curl --cacert Dovrei eseguire la mia autorità di certificazione locale, che vorrei impedire, perché ciò aggiunge molta complessità. È anche molto difficile e nessuno lo ha mai fatto prima. ( 4 )

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

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

    
posta James Mitch 19.09.2012 - 22:51
fonte

1 risposta

7

NUOVA RISPOSTA:

Rivedendo il tuo link n. 4, sembra che tu abbia esaminato le utility esistenti e ricevuto la risposta che ciò che vuoi dovrebbe essere programmato. Fare ciò è relativamente banale. Il seguente script Perl farà ciò che vuoi:

#!/usr/bin/perl
# 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 delineato nella documentazione di Net :: SSLeay, questo metodo indica la verifica dopo la transazione HTTP , quindi non dovrebbe essere usato se si desidera verificare che si stia parlando con il server giusto < em> prima invio dei dati. Ma se tutto quello che stai facendo è decidere se fidarti o meno di ciò che hai appena scaricato (che sembra essere il tuo riferimento n. 4), va bene.

VECCHIA RISPOSTA:

Puoi usare openssl come descritto qui :

A wit,

openssl s_client -connect <host>:<port> < /dev/null 2>/dev/null | openssl x509 -fingerprint -noout -in /dev/stdin

(La vecchia risposta era) Aggiornato

Come ha sottolineato @Gilles, questo non soddisfa il requisito di combinare la verifica del certificato con il recupero del contenuto effettivo.

Poiché openssl s_client combina le informazioni del certificato e la risposta del server nel flusso stdout, non può essere semplicemente usato per questo scopo. Probabilmente è possibile scrivere uno script che risucchierà l'output combinato e separerà i due in base ad alcuni semplici test di analisi, ma non è esattamente una soluzione chiavi in mano.

    
risposta data 19.09.2012 - 23:14
fonte

Leggi altre domande sui tag