Tengo un problema al utilizar el resumen sha1 en la prueba de fijación de certificados. Usar sha256 funciona bien, pero si uso sha1 no funciona. ¿Por qué?
versión de rizo: ➜ origen ./curl -V curl 7.55.1 (x86_64-apple-darwin16.0.0) libcurl/7.55.1 SecureTransport zlib/1.2.8 Fecha de lanzamiento: 2017-08-14 Protocolos: archivo dict ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp Características: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL libz UnixSocketsPRUEBA 1 usandosha256 ➜ src openssl s_client -connect uol.com.br:443 | openssl x509 -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst sha256 -binario | openssl enc -base64 profundidad=2 /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA verificar error:num=19:certificado autofirmado en cadena de certificados verificar devolución:0 escribiendo clave RSA d9W9zyq64Gw8JEA/siAixfvoRRwZVpSgbYJV//0CeKM=
➜ src ./curl --head --verbose --pinnedpubkey "sha256//d9W9zyq64Gw8JEA/siAixfvoRRwZVpSgbYJV//0CeKM="https://uol.com.br * Probando 200.147.67.142... * TCP_NODELAY establecido * Conectado a uol.com.br (200.147.67.142) puerto 443 (#0) * hash de clave pública: sha256//d9W9zyq64Gw8JEA/siAixfvoRRwZVpSgbYJV//0CeKM= * Conexión TLS 1.2 usando TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 * Certificado de servidor: www.uol.com.br * Certificado de servidor: RapidSSL SHA256 CA * Certificado de servidor: GeoTrust Global CA > CABEZA/HTTP/1.1 > Anfitrión: uol.com.br > Usuario-Agente: curl/7.55.1 > Aceptar:/ > <HTTP/1.1 302 encontrado HTTP/1.1 302 encontrado < Fecha: viernes, 29 de septiembre de 2017 19:32:18 GMT Fecha: viernes, 29 de septiembre de 2017 19:32:18 GMT < Servidor: Apache Servidor: Apache < Conexión: cerrar Conexión: cerrar < Tipo de contenido: texto/html; juego de caracteres=iso-8859-1 Tipo de contenido: texto/html; juego de caracteres=iso-8859-1 < * Cerrando conexión 0
PRUEBA 2 usandosha1 ➜ src openssl s_client -connect uol.com.br:443 | openssl x509 -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha1 -binario | openssl enc -base64 profundidad=2 /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA verificar error:num=19:certificado autofirmado en cadena de certificados verificar devolución:0 escribiendo clave RSA BQr5oEtKUmTzlcelRcWvGvMnQzk=
➜ src ./curl --head --verbose --pinnedpubkey "sha1//BQr5oEtKUmTzlcelRcWvGvMnQzk="https://uol.com.br * Probando 200.221.2.45... * TCP_NODELAY establecido * Conectado a uol.com.br (200.221.2.45) puerto 443 (#0) * SSL: ¡la clave pública no coincide con la clave pública fijada! * Cerrando conexión 0 curl: (90) SSL: ¡la clave pública no coincide con la clave pública fijada!
Respuesta1
Porque curl
solo verifica los hashes SHA256; no hashes SHA1.
Desde la página de manual:
--pinnedpubkey <clave pública fijada (hashes)>
(SSL) Tells curl to use the specified public key file (or hashes) to verify the peer. This can be a path to a file which contains a single public key in PEM or DER format, or any number of base64 encoded sha256 hashes preceded by ´sha256//´ and sepa‐ rated by ´;´