为什么使用 sha1 摘要的 curl 证书固定测试不起作用?

为什么使用 sha1 摘要的 curl 证书固定测试不起作用?

我在证书固定测试中使用 sha1 摘要时遇到问题。使用 sha256 可以正常工作,但如果使用 sha1 则不起作用。为什么?

curl 版本:
 
➜ 源码./curl -V
curl 7.55.1 (x86_64-apple-darwin16.0.0) libcurl/7.55.1 SecureTransport zlib/1.2.8
发布日期:2017-08-14
协议:dict 文件 ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
功能:AsynchDNS IPv6 大文件 NTLM NTLM_WB SSL libz UnixSockets

测试 1 使用sha256   ➜ 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 使用sha1   ➜ 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 密钥 BQr5oEtKUmTzlcelRcWvGvMnQzk=

➜ 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

因为curl只检查 SHA256 哈希;而不是 SHA1 哈希。

从手册页中:

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

相关内容