¿Cómo verificar la huella digital SSL por línea de comando? (wget, rizo, ...)

32

Usar un descargador de sitios web de línea de comandos, como wget, curlo cualquier otro ... En un script ...

Tengo la huella digital certificada SHA-1 y SHA-256 de un sitio web. Debido a problemas de seguridad ( 1 ) ( 2 ), no quiero usar el sistema público de autoridad de certificación SSL. La huella digital debe estar codificada.

¿Puede una aplicación como wget verificar la huella digital SSL?

wget no tiene esa funcionalidad. ( 3 )

Usar wget --ca-certificateo curl --cacerttendría que ejecutar mi propia autoridad de certificación local, lo que me gustaría evitar, porque eso agrega mucha complejidad. También es ultra difícil y nadie lo había hecho antes. ( 4 )

¿No hay alguna herramienta como
download --tlsv1 --serial-number xx:yy:zz --fingerprint xxyyzz https://site.com?

La solución, por supuesto, no debe ser vulnerable a TOCTOU. ( 5 ) El MITM podría permitir devolver una huella digital válida para la solicitud del cliente openssl y alterar la siguiente solicitud de wget.

James Mitch
fuente
Probablemente necesite hacer algo de magia OpenSSL como: cyberciti.biz/faq/…
Justin Andrusk
Visitantes: tenga en cuenta que esto fue publicado en el infosec SE . Una de las respuestas fue copiada desde allí. Este es un comportamiento mal visto, por cierto.
Félix Saparelli

Respuestas:

31

Fuente

Instale el software requerido:

apt-get install ca-certificates curl

Descargue el 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

O mejor:

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

Obtenga la huella digital SHA-1:

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

Obtenga la huella digital SHA-256:

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

Compare manualmente las huellas digitales SHA-1 y SHA-256 con torproject.org Preguntas frecuentes: SSL .

.

Opcionalmente, los certificados ca son inútiles para fines de prueba. Usando curl aquí, pero wget tiene un error Bug y usa los archivos ca de todos modos.

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

Descargar con curl y el certificado anclado:

curl --cacert ./torproject.pem https://check.torproject.org/ > check.html
James Mitch
fuente
sin embargo, esto no funciona en presencia de un proxy: - /
Frederick Nord
Tenga en cuenta que la opción -CAfile se ignora por completo en su ejemplo.
Lars
11

En tcsh:

echo | openssl s_client -connect host.example.com:443 |& openssl x509 -fingerprint -noout
usuario273818
fuente
3
funciona en zsh, también debería funcionar para bash
número5
10

Esto también es suficiente:

openssl x509 -fingerprint -in server.crt
rundekugel
fuente
Agregar -md5opción para recuperar la huella digital MD5. -md5no debe ponerse entre -iny server.crt.
皞 皞
4

Esto es bastante fácil de hacer con el opensslcomando y la funcionalidad de su cliente.

El siguiente pequeño script tomará un dominio dado (sin prefijo https) y una huella digital SHA-1, y saldrá sin error (0) si la huella digital recuperada coincide, pero con el código de salida 1 si no hay coincidencia. Luego puede incorporarlo a su script simplemente probando el último código de salida $?:

#! / bin / bash
FPRINT = `echo -n | openssl s_client -connect $ 1: 443 2> / dev / null \ | openssl x509 -noout -fingerprint | cut -f2 -d '=' ' if ["$ 2" = "$ FPRINT"]; luego salida 0 más salida 1 fi
ish
fuente
Es vulnerable a TOCTOU. [1] El MITM podría permitir devolver una huella digital válida para la solicitud del cliente openssl y alterar la siguiente solicitud de wget. [1] en.wikipedia.org/wiki/Time_of_check_to_time_of_use
James Mitch
Es cierto, en teoría. Sería bastante fácil modificarlo wgety compilarlo con OpenSSL para que realice lo que desea en línea, pero eso está más allá del alcance de una respuesta AU.
ish
Entonces, ¿qué hay de usar s_client para recuperar también el documento? Algo así (echo -ne "Host: ${HOST}\n\rGET ${URL}\n\r" && yes) 2>/dev/null | openssl s_client -connect ${HOST}:443debería funcionar, ¿no? Bueno, debe dividir la información de la sesión SSL de la respuesta de contenido real.
taneli
3

fuente

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

Como se describe en la documentación de Net :: SSLeay, este método significa verificación después de la transacción HTTP, por lo que no debe utilizarse si desea verificar que está hablando con el servidor correcto antes de enviarles datos. Pero si todo lo que está haciendo es decidir si confiar o no en lo que acaba de descargar (que parece ser de su referencia # 4), está bien.

James Mitch
fuente
1

Ese es mi guión cotidiano:

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
fuente