sha1 ダイジェストを使用して curl 証明書ピンニング テストが機能しないのはなぜですか?

sha1 ダイジェストを使用して curl 証明書ピンニング テストが機能しないのはなぜですか?

証明書ピンニング テストで sha1 ダイジェストを使用すると問題が発生します。sha256 を使用すると正常に動作しますが、sha1 を使用すると動作しません。なぜでしょうか。

curl のバージョン:
 
➜ ソース ./curl -V
curl 7.55.1 (x86_64-apple-darwin16.0.0) libcurl/7.55.1 セキュアトランスポート zlib/1.2.8
リリース日: 2017-08-14
プロトコル: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
機能: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL libz UnixSockets

テスト1sha256   ➜ 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 深さ=2 /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA 検証エラー:num=19:証明書チェーン内の自己署名証明書 戻り値の確認:0 RSAキーの書き込み d9W9zyq64Gw8JEA/siAixfvoRRwZVpSgbYJV//0CeKM=

➜ src ./curl --head --verbose --pinnedpubkey "sha256//d9W9zyq64Gw8JEA/siAixfvoRRwZVpSgbYJV//0CeKM="https://uol.com.br * 200.147.67.142 を試行しています... * TCP_NODELAY 設定 * uol.com.br (200.147.67.142) ポート 443 (#0) に接続しました * 公開鍵ハッシュ: sha256//d9W9zyq64Gw8JEA/siAixfvoRRwZVpSgbYJV//0CeKM= * TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 を使用した TLS 1.2 接続 * サーバー証明書: www.uol.com.br * サーバー証明書: RapidSSL SHA256 CA * サーバー証明書: GeoTrust Global CA > ヘッド / HTTP/1.1 > ホスト: uol.com.br > ユーザーエージェント: curl/7.55.1 > 承認:/ > < HTTP/1.1 302 が見つかりました HTTP/1.1 302 が見つかりました < 日付: 2017年9月29日金曜日 19:32:18 GMT 日付: 2017年9月29日金曜日 19:32:18 GMT < サーバー: Apache サーバー: Apache < 接続: 閉じる 接続: 閉じる < コンテンツタイプ: text/html; 文字セット=iso-8859-1 コンテンツタイプ: text/html; 文字セット=iso-8859-1   < * 接続0を閉じています

テスト2使用シャ1   ➜ 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 深さ=2 /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA 検証エラー:num=19:証明書チェーン内の自己署名証明書 戻り値の確認:0 RSAキーの書き込み 翻訳:

➜ src ./curl --head --verbose --pinnedpubkey "sha1//BQr5oEtKUmTzlcelRcWvGvMnQzk="https://uol.com.br * 200.221.2.45 を試行しています... * TCP_NODELAY 設定 * uol.com.br (200.221.2.45) ポート 443 (#0) に接続しました * SSL: 公開キーが固定された公開キーと一致しません。 * 接続0を閉じています curl: (90) SSL: 公開鍵が固定された公開鍵と一致しません。

答え1

curlSHA256 ハッシュのみをチェックし、SHA1 ハッシュはチェックしないためです。

man ページから:

--pinnedpubkey <固定された公開鍵(ハッシュ)>

          (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 ´;´

関連情報