Go 1.27 在 crypto/x509 中不再信任九个中间证书

Mores的头像Mores
Go 1.27 在 crypto/x509 中不再信任九个中间证书

Go 团队向 release-branch.go1.27 推送安全更新,修改 crypto/x509 包,使证书验证拒绝包含九个特定中间证书的证书链。该改动将随 Go 1.27 正式版发布,使用 Go 1.27 构建的程序无需修改代码即会生效。

提交 90617fb 在 verify.go 中引入 distrustedSPKIHashes 映射,保存九张证书原始 Subject Public Key Info 的 SHA-256 哈希,并新增 containsDistrustedSPKIHash 函数逐张检查链中证书。

改动内容

这次更新以提交 90617fb 的形式进入 golang/go 仓库的 release-branch.go1.27 分支,修改对象是标准库中的 crypto/x509 包。改动后,证书验证会拒绝包含九张特定中间证书的证书链,这九张证书被 Go 安全团队列为不再可信。

由于改动落在发布分支上,它会随 Go 1.27 正式版一同发布。用 Go 1.27 构建的程序不需要修改任何代码,证书验证行为就会随之改变。

三处验证路径

过滤逻辑分布在三个位置。在 macOS 上,root darwin.go 在系统验证过程中执行该检查;如果 chain[0] 含有被列入名单的 SPKI,函数返回 CertificateInvalidError,原因为 NoValidChains。

在 Windows 上,root windows.go 使用 slices.DeleteFunc 把匹配的证书链从结果集中删除。如果过滤后列表为空且此前没有其他错误,函数返回同样的无效证书错误。

在 verify.go 中,Verify 方法在返回结果之前过滤掉被列入名单的证书链。三条路径覆盖了系统验证与显式调用 Verify 两类常见场景,使过滤不依赖调用方所在平台。

为何用 SPKI 哈希

选择 SPKI 哈希而非整张证书的指纹,针对的是底层公钥本身。这样做的目的是防止某个已被撤销或不再被信任的中间证书,通过一张使用同一密钥对重新签发的证书重新进入信任范围。

换言之,只要公钥相同,即使证书本身被重新签发、序列号或有效期发生变化,仍会被识别并过滤。这一设计把不信任的对象从单张证书扩展到对应的密钥材料。

影响范围

九张哈希对应的是 Go 安全团队不再认为可信的中间证书。对使用 Go 1.27 的开发者而言,若服务端证书链中包含这些中间证书,验证将失败,且不会出现需要修改代码才能触发的提示。

该更新仅涉及 crypto/x509 的验证逻辑,来源未说明这九张证书的签发机构、失效原因或具体名单,也未提及是否会在更早的 Go 版本中回移。相关讨论页面目前尚无评论。

要点

  • Go 1.27 发布分支新增九个硬编码 SPKI 哈希
  • 被过滤的是九张不再受信任的中间证书
  • macOS 系统验证命中时返回 NoValidChains 错误
  • Windows 路径用 slices.DeleteFunc 剔除匹配链
  • 使用 SPKI 哈希可防止同密钥重签证书重回信任

原文链接

更多快讯

全部快讯
  1. OVHcloud CLI 多个版本被植入后门,用于窃取开发者密钥
  2. Fortinet 多个漏洞遭利用,电信机构被植入 PeerStitch 后门
  3. 韩国五大银行行长就接连黑客攻击事件公开致歉
  4. 美国以国家安全为由限制进口中国人形与四足机器人
  5. SiteGuard 防火墙曝严重命令注入漏洞,已被用于获取 root 权限

0 条回复

A文章作者M管理员
上传评论图片

暂无讨论,说说你的看法吧