Como verificar a impressão digital SSL por linha de comando? (wget, enrolar,…)

32

Usando um site de linha de comando downloader, tais como wget, curlou em qualquer outro ... Em um script ...

Eu tenho as impressões digitais certificadas de SHA-1 e SHA-256 de um site. Devido a questões de segurança ( 1 ) ( 2 ), não quero usar o sistema público de autoridades de certificação SSL. A impressão digital deve ser codificada.

Um aplicativo semelhante ao wget pode verificar a impressão digital SSL?

O wget não possui essa funcionalidade. ( 3 )

Usando wget --ca-certificateou curl --cacerteu teria que executar minha própria autoridade de certificação local, o que eu gostaria de impedir, porque isso adiciona muita complexidade. Também é ultra difícil e ninguém fez isso antes. ( 4 )

Não existe nenhuma ferramenta, como
download --tlsv1 --serial-number xx:yy:zz --fingerprint xxyyzz https://site.com?

Obviamente, a solução não deve ser vulnerável ao TOCTOU. ( 5 ) O MITM pode permitir retornar uma impressão digital válida para a solicitação do cliente openssl e violar a solicitação wget a seguir.

James Mitch
fonte
Provavelmente precisa fazer alguma mágica OpenSSL tais como: cyberciti.biz/faq/...
Justin Andrusk
Visitantes: observe que isso foi postado cruzadamente no infosec SE . Uma das auto-respostas foi copiada de lá. Esse é um comportamento desaprovado, aliás.
Félix Saparelli

Respostas:

31

Fonte

Instale o software necessário:

apt-get install ca-certificates curl

Faça o download do certificado SSL público:

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

Ou melhor:

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

Obtenha a impressão digital SHA-1:

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

Obtenha a impressão digital SHA-256:

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

Compare manualmente as impressões digitais SHA-1 e SHA-256 com a torproject.org FAQ: SSL .

.

Opcionalmente, torne os certificados ca inúteis para fins de teste. Usando curl aqui, mas o wget tem um bug Bug e usa os arquivos ca de qualquer maneira.

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

Faça o download com curl e o certificado fixado:

curl --cacert ./torproject.pem https://check.torproject.org/ > check.html
James Mitch
fonte
isso não funciona na presença de um proxy, no entanto: - /
Frederick Nord
Observe que a opção -CAfile é completamente ignorada no seu exemplo.
Lars
11

No tcsh:

echo | openssl s_client -connect host.example.com:443 |& openssl x509 -fingerprint -noout
user273818
fonte
3
trabalha em zsh, devem trabalhar para a festança também
Number5
10

Isso também é suficiente:

openssl x509 -fingerprint -in server.crt
rundekugel
fonte
Adicionar -md5opção para recuperar a impressão digital MD5. -md5não deve colocar entre -ine server.crt.
林果皞
4

Isso é bastante fácil de fazer com o opensslcomando e sua funcionalidade do cliente.

O pequeno script a seguir pegará um determinado domínio (sem prefixo https) e uma impressão digital SHA-1 e sairá sem erro (0) se a impressão digital recuperada corresponder, mas com o código de saída 1 se não houver correspondência. Você pode incorporá-lo ao seu script simplesmente testando o último código de saída $?:

#! / bin / bash
FPRINT = `eco -n | openssl s_client -connect $ 1: 443 2> / dev / null \ | openssl x509 -noout -fingerprint | cut -f2 -d '=' ' if ["$ 2" = "$ FPRINT"]; então saída 0 outro saída 1 fi
ish
fonte
É vulnerável ao TOCTOU. [1] O MITM pode permitir retornar uma impressão digital válida para a solicitação do cliente openssl e violar a solicitação wget a seguir. [1] pt.wikipedia.org/wiki/Time_of_check_to_time_of_use
James Mitch
Verdade, em teoria. Seria bastante fácil modificá wget-lo e compilá-lo com o OpenSSL para que ele execute o que você deseja em linha, mas isso está além do escopo de uma resposta da UA.
Ish
Então, que tal usar s_client para recuperar também o documento? Algo como (echo -ne "Host: ${HOST}\n\rGET ${URL}\n\r" && yes) 2>/dev/null | openssl s_client -connect ${HOST}:443deveria funcionar, não? Bem, você precisa dividir as informações da sessão SSL da resposta real do conteúdo.
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;
}

Conforme descrito na documentação do Net :: SSLeay, esse método significa verificação após a transação HTTP e, portanto, não deve ser usado se você quiser verificar se está falando com o servidor certo antes de enviar os dados. Mas se tudo o que você está fazendo é decidir se deve ou não confiar no que você acabou de baixar (o que parece ser da sua referência nº 4), tudo bem.

James Mitch
fonte
1

Esse é o meu roteiro diário:

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
fonte