跳转到正文
buybitcoinsmart

术语表 /开发者参考

中间证书

中间证书是什么?
中间证书位于根证书和叶证书之间,由根证书签发,并为叶证书签名,因此根证书的私钥可以保持离线、不被使用。

证书颁发机构从不使用根密钥为网站的证书签名。它们为中间证书签名,将根密钥锁在离线环境中,再由中间证书签发证书。中间证书可以在数周内更换,而根证书的寿命长达二十年。当服务器忘记发送其中间证书时,浏览器会掩盖这一缺口,更严格的客户端则不会,因此一个网站可能在 Chrome 中显示正常,却在某个应用中失败。

运作方式

中间证书是一种并非信任锚的颁发机构证书。它带有 basicConstraints 扩展,其中 CA 设为 true,这允许它继续签发其他证书,而它本身由根证书或另一个中间证书签名。验证从服务器的证书开始向上进行,用上一级证书中的密钥核对每一个签名,直到遇到本地信任库中已有的证书为止。

这样拆分签发环节有三点好处。根密钥保存在离线模块中,仅在按脚本执行、有人见证的仪式上取出。损害可以被限定在局部,因为被攻破的中间证书可以被吊销并重新签发,而无需改动任何设备的根证书库。颁发机构还可以划分产品线,使廉价自动化层级出现的问题不会牵连经过审计的层级。

交叉签名是让新的颁发机构得以使用的关键做法。同一个中间密钥可以持有两张证书:一张由其所属机构自己的根证书签名,另一张由已存在于旧设备上的成熟根证书签名。Let's Encrypt 多年来依靠这一做法,因为已停止接收更新的 Android 版本中没有 ISRG Root X1,所以它提供的是由 IdenTrust 交叉签名的证书链。这根拐杖比它背后的根证书存续得更久,该根证书已于2021年9月30日到期,而 Let's Encrypt 最终于2024年6月6日停止提供交叉签名的证书链。

证书链的组装是运营者最容易出错的环节。服务器应发送自己的证书以及其上的所有中间证书,但不包括根证书,因为客户端已经拥有根证书。浏览器会通过颁发机构信息访问扩展中的 URL 获取缺失的部分,或复用缓存副本,从而掩盖遗漏。支付库、移动应用或命令行客户端通常两者都不做,只会报告证书链不受信任。

在哪里会遇到它

BIP70 将中间证书放在支付消息本身之中。pki_data 字段携带一个 X509Certificates 结构,其第一项是商户自己的证书,随后是抵达根证书所需的各个中间证书,根证书则被省略,因为钱包应当已经持有它。这正是 TLS 服务器发送证书的顺序,只是被搬进了协议缓冲区。

在比特币之外,只要一次连接在某个程序中成功、在另一个程序中失败,就说明存在中间证书的问题。如果某家交易所的 API 端点向交易脚本抛出证书错误,而网站却能正常加载,那么几乎可以肯定是它的证书链漏掉了某个中间证书。使用不会执行浏览器那种静默修复的工具进行测试,可以在您的机器人遇到问题之前发现这一点。

中间证书 vs 根证书

根证书和中间证书都是颁发机构证书,区别在于由谁签名以及密钥存放在哪里。根证书是自签名的,其效力来自软件厂商的收录列表。中间证书的效力来自上一级的签名,这意味着颁发机构可以在一个下午内将其吊销,无需任何软件更新。在日常运作中,几乎所有签名工作都由中间证书完成,根证书几乎不参与,这种不对称正是这一层存在的全部原因。

请勿混淆

常见问题

为什么网站在我的浏览器中能加载,在应用或脚本中却失败?

通常是缺少中间证书。浏览器会借助颁发机构信息访问扩展悄悄获取缺失的证书,而大多数库和命令行客户端不会,因此同一台服务器在某处看似受信任,在另一处却不受信任。

中间证书可以被吊销吗?

可以,这正是这一层存在的主要原因。颁发机构可以立即吊销中间证书,而要移除被攻破的根证书,则需要在每一台内置根证书库的设备上进行软件更新。

相关术语

开发者参考中的更多术语

阅读本页英文版