术语表 /开发者参考
证书链
- 证书链是什么?
- 证书链是一份有序的证书列表,把服务器出示的证书与您的设备已经信任的根证书连接起来,每一环都由下一环签名。
设立证书链,是为了让最有价值的密钥可以保持离线。根证书只为少数几个中间证书签名,随后便重新存入保险库,日常为服务器签名的工作由中间证书完成。验证则沿相反方向进行:从您收到的证书一路向上,直到您的设备原本就有的某个证书;只要任何一环缺失、已过期或无法识别,验证就会失败。
运作方式
一条典型的证书链由三个层级组成,而服务器只发送其中两个。
最底层是叶证书,为一组特定的域名签发。其上是一个或多个中间证书,作用是把根证书与日常使用隔离开来。最顶层是根证书,它自行签名,在您访问该网站之前很早就已存在于您的信任库中。服务器发送叶证书和中间证书,因为发送根证书只会增加字节数,却证明不了什么:根证书只有在您本来就持有时才有效。
验证并不是沿着一份列表直线向上走。同一个证书可以由多个颁发者签名,这种做法称为交叉签名,因此客户端可能面对多条候选路径,需要找到一条终止于自己所持根证书的路径。这就是同一个网站在新笔记本电脑上能打开、在旧手机上却失败的原因:信任库不同,路径也就不同。
最清楚的例子仍然是 Let's Encrypt 的过渡。其自有根证书 ISRG Root X1 由较早的 DST Root CA X3 交叉签名,使尚未添加 X1 的设备仍能构建出一条路径。DST Root CA X3 已于2021年9月30日过期。持有 X1 的设备在无人察觉的情况下切换了路径,而低于7.1.1的 Android 版本和若干旧版 TLS 库却没有切换,连接在一个下午内在全球范围内中断。当时没有任何系统被入侵,也没有任何密钥泄露,只是一个日期到了。
在哪里会遇到它
证书链问题看上去令人担忧,但几乎总是平常的原因。
最常见的服务器配置错误是遗漏了中间证书。浏览器往往会掩盖这个问题:缓存以前访问时获得的中间证书,或从证书内的某个 URL 获取,因此站点对管理员来说正常,而对命令行工具和手机却会失败,这使它成为一个排查起来格外令人头疼的错误。
对于管理比特币的人来说,证书链错误的有用解读在于诊断。当交易所在一台设备上出现证书错误、在另一台设备上正常时,差别几乎总是出在设备上:系统时钟不准、操作系统过旧而未收到较新的根证书,或是杀毒软件插入了连接。请先排查设备,不要先假定遭到攻击,也不要为了进入网站而点击跳过警告。
硬件钱包的认证采用同样的结构,只是规模小得多:包含厂商根证书、有时还有一个中间证书,以及存放在设备本身上的证书。
证书链 vs 根证书
证书链是一条路径;根证书则是这条路径必须终止的地方。证书链中除根证书之外的每个证书,被信任都只是因为其上方有证书为它签名;根证书被信任,则是因为它出现在您的设备出厂时自带的列表上,并且为自己签名。因此,把一个根证书添加到该列表中,是比接受任何其他证书重大得多的决定,而企业网络和流量拦截工具恰恰会要求您这样做。