¿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.


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

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

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

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

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.