warum funktioniert der Curl-Zertifikat-Pinning-Test nicht mit SHA1-Digest?

warum funktioniert der Curl-Zertifikat-Pinning-Test nicht mit SHA1-Digest?

Ich habe ein Problem mit der Verwendung von SHA1 Digest beim Zertifikats-Pinning-Test. Mit SHA256 funktioniert es einwandfrei, aber mit SHA1 funktioniert es nicht. Warum?

Version von curl:
 
➜ src ./curl -V
curl 7.55.1 (x86_64-apple-darwin16.0.0) libcurl/7.55.1 SecureTransport zlib/1.2.8
Erscheinungsdatum: 14.08.2017
Protokolle: dict, Datei, FTP, FTPS, Gopher, http, https, IMAP, IMAPs, LDAP, LDAPS, POP3, POP3S, RTSP, SMB, SMBS, SMTP, SMTPs, Telnet, TFTP
Funktionen: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL libz UnixSockets

TEST 1 mitsha256   ➜ src openssl s_client -connect uol.com.br:443 | openssl x509 -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst sha256 -binary | openssl enc -base64 Tiefe=2 /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA Überprüfungsfehler: Num=19: selbst signiertes Zertifikat in der Zertifikatskette Überprüfen Sie die Rückgabe: 0 RSA-Schlüssel schreiben d9W9zyq64Gw8JEA/siAixfvoRRwZVpSgbYJV//0CeKM=

➜ src ./curl --head --verbose --pinnedpubkey "sha256//d9W9zyq64Gw8JEA/siAixfvoRRwZVpSgbYJV//0CeKM="https://uol.com.br * Versuche 200.147.67.142 … * TCP_NODELAY gesetzt * Verbunden mit uol.com.br (200.147.67.142) Port 443 (#0) * öffentlicher Schlüssel-Hash: sha256//d9W9zyq64Gw8JEA/siAixfvoRRwZVpSgbYJV//0CeKM= * TLS 1.2-Verbindung mit TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 * Serverzertifikat: www.uol.com.br * Serverzertifikat: RapidSSL SHA256 CA * Serverzertifikat: GeoTrust Global CA > KOPF / HTTP/1.1 > Host: uol.com.br > Benutzer-Agent: curl/7.55.1 > Akzeptieren:/ > < HTTP/1.1 302 gefunden HTTP/1.1 302 gefunden < Datum: Fr., 29. September 2017, 19:32:18 GMT Datum: Fr., 29. September 2017, 19:32:18 GMT < Server: Apache Server: Apache < Verbindung: schließen Verbindung: schließen < Inhaltstyp: text/html; Zeichensatz=iso-8859-1 Inhaltstyp: text/html; Zeichensatz=iso-8859-1   < * Verbindung wird geschlossen 0

TEST 2 mitsha1   ➜ src openssl s_client -connect uol.com.br:443 | openssl x509 -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha1 -binary | openssl enc -base64 Tiefe=2 /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA Überprüfungsfehler: Num=19: selbst signiertes Zertifikat in der Zertifikatskette Überprüfen Sie die Rückgabe: 0 RSA-Schlüssel schreiben BQr5oEtKUmTzlcelRcWvGvMnQzk=

➜ src ./curl --head --verbose --pinnedpubkey "sha1//BQr5oEtKUmTzlcelRcWvGvMnQzk="https://uol.com.br * Versuche 200.221.2.45 … * TCP_NODELAY gesetzt * Verbunden mit uol.com.br (200.221.2.45) Port 443 (#0) * SSL: öffentlicher Schlüssel stimmt nicht mit dem fixierten öffentlichen Schlüssel überein! * Verbindung wird geschlossen 0 curl: (90) SSL: öffentlicher Schlüssel stimmt nicht mit dem fixierten öffentlichen Schlüssel überein!

Antwort1

Weil curlnur SHA256-Hashes überprüft werden, keine SHA1-Hashes.

Aus der Manpage:

--pinnedpubkey <gepinnter öffentlicher Schlüssel (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 ´;´

verwandte Informationen