por que o teste de fixação de certificado curl não funciona usando o resumo sha1?

por que o teste de fixação de certificado curl não funciona usando o resumo sha1?

Tenho um problema ao usar o resumo sha1 no teste de fixação de certificado. Usar sha256 funciona bem, mas se eu usar sha1 não funciona. Por que?

versão do curl:
 
➜src ./curl -V
curl 7.55.1 (x86_64-apple-darwin16.0.0) libcurl/7.55.1 SecureTransport zlib/1.2.8
Data de lançamento: 14/08/2017
Protocolos: arquivo dict ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Recursos: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL libz UnixSockets

TESTE 1 usandosha256   ➜ src openssl s_client -connect uol.com.br:443 | openssl x509 -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst sha256 -binário | openssl enc-base64 profundidade=2 /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA verifique o erro:num=19:certificado autoassinado na cadeia de certificados verificar retorno:0 escrevendo a chave RSA d9W9zyq64Gw8JEA/siAixfvoRRwZVpSgbYJV//0CeKM=

➜ src ./curl --head --verbose --pinnedpubkey "sha256//d9W9zyq64Gw8JEA/siAixfvoRRwZVpSgbYJV//0CeKM="https://uol.com.br * Tentando 200.147.67.142... * Conjunto TCP_NODELAY * Conectado ao uol.com.br (200.147.67.142) porta 443 (#0) * hash de chave pública: sha256//d9W9zyq64Gw8JEA/siAixfvoRRwZVpSgbYJV//0CeKM= * Conexão TLS 1.2 usando TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 *Certificado do servidor: www.uol.com.br * Certificado de servidor: RapidSSL SHA256 CA * Certificado de servidor: GeoTrust Global CA > CABEÇA/HTTP/1.1 > Anfitrião: uol.com.br > Agente do usuário: curl/7.55.1 > Aceitar:/ > <HTTP/1.1 302 encontrado HTTP/1.1 302 encontrado < Data: Sexta-feira, 29 de setembro de 2017 19:32:18 GMT Data: Sexta-feira, 29 de setembro de 2017, 19:32:18 GMT <Servidor: Apache Servidor: Apache <Conexão: fechar Conexão: fechar <Tipo de conteúdo: texto/html; conjunto de caracteres=iso-8859-1 Tipo de conteúdo: texto/html; conjunto de caracteres=iso-8859-1   < * Fechando conexão 0

TESTE 2 usandosha1   ➜ src openssl s_client -connect uol.com.br:443 | openssl x509 -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha1 -binário | openssl enc-base64 profundidade=2 /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA verifique o erro:num=19:certificado autoassinado na cadeia de certificados verificar retorno:0 escrevendo a chave RSA BQr5oEtKUmTzlcelRcWvGvMnQzk=

➜ src ./curl --head --verbose --pinnedpubkey "sha1//BQr5oEtKUmTzlcelRcWvGvMnQzk="https://uol.com.br * Tentando 200.221.2.45... * Conjunto TCP_NODELAY * Conectado ao uol.com.br (200.221.2.45) porta 443 (#0) * SSL: a chave pública não corresponde à chave pública fixada! * Fechando conexão 0 curl: (90) SSL: a chave pública não corresponde à chave pública fixada!

Responder1

Porque curlverifica apenas hashes SHA256; não hashes SHA1.

Na página de manual:

--pinnedpubkey <chave pública fixada (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 ´;´

informação relacionada