术语表

SHA-1 (安全哈希算法 1)

最后核实

定义

SHA-1 是 1995 年发布的 160 位哈希函数,已出现实际可行的碰撞攻击,公开信任的 TLS 证书早已不再允许使用它签名。

SHA-1 是由 NSA 设计、NIST 于 1995 年在 FIPS 180-1 中发布的哈希函数,输出 160 位摘要。2005 年起就有理论攻击公开发表;2017 年 2 月,Google 与荷兰 CWI 的研究人员公布了 SHAttered,这是第一个公开的 SHA-1 碰撞实例:两个内容不同的 PDF 文件摘要完全相同。2020 年又出现了选择前缀碰撞,这类攻击让伪造证书等签名对象变得现实可行。

为什么重要

证书签名签的是证书内容的哈希,哈希被攻破,签名也就失去意义。CA/浏览器论坛的 Baseline Requirements 规定自 2016 年 1 月 1 日起停止签发 SHA-1 签名的 TLS 证书,主流浏览器在 2017 年初也不再接受 SHA-1 签名的 TLS 证书。如今证书都使用 SHA-256 或 SHA-384 签名。SHA-1 仍会出现在一些无害的地方,比如工具显示的证书指纹、旧密码套件中的 HMAC-SHA1。国内一些老旧内网系统和设备自带的证书可能仍是 SHA-1 签名,迁移时值得留意。

例子

查看证书签名使用的哈希;叶子证书或中间证书出现 sha1WithRSAEncryption 就要警惕:

openssl x509 -in example.com.crt -noout -text | grep 'Signature Algorithm'
openssl x509 -in example.com.crt -noout -fingerprint -sha1

第二条命令只是在本地计算 SHA-1 指纹,与证书用什么算法签名无关。

常见误区

  • 显示了 SHA-1 指纹,说明证书用的是 SHA-1。 指纹由查看者自行选择哈希算法计算,和证书的签名算法毫无关系。
  • 以 -SHA 结尾的套件因 SHA-1 被攻破而不安全。 这些套件用的是 HMAC-SHA1,并不依赖抗碰撞性,淘汰它们的理由是 CBC 模式和缺少 AEAD。
  • 用 SHA-1 自签名的根证书必须更换。 根证书之所以可信,是因为它在信任库里,而不是靠自签名;真正要紧的是中间证书和叶子证书上的签名。

延伸阅读