一次 TLS 会话的可靠程度,只取决于从叶证书回到客户端信任的根之间的路径。这条路径就是证书链,发布声明应该能从公共边缘把它读出来,而不是假设它存在。

叶证书不是全部

主机名所出示的证书是叶。它携带你以 check-tls-expiry.sh 检查的确切主体与有效期。但叶是由某个中间 CA 签发,而中间 CA 又由根签发。客户端会验证链上的每一环。如果边缘只出示叶而不带中间证书,进行深度验证的客户端可能即使叶本身没问题也验证失败。

读边缘实际发送的链

openssl s_client -showcerts 会打印服务器发送的链中每一张证书。对本网站而言,答案是一张叶,加上通向 CA 公布根的中途的中间证书:

certificate 0: CN=www.xbcatm.com
    issuer    : C=US, O=Let's Encrypt, CN=YE1
    notAfter  : Nov 19 08:37:12 2026 GMT

certificate 1: CN=YE1(中间)
    issuer    : CN=Root YE

certificate 2/3: Root YE / ISRG Root …(信任锚)

这里到达了四个证书块。该网站出示叶,加上能让客户端构建到公开信任锚的中间证书。只看叶的操作者会漏掉中间证书是否在场。

为什么中间证书对信任重要

根是客户端向上走到的对象。存在中间签发者,是为了让根可以离线、且无需给每张叶重新签发即可吊销。你用 CAA 记录授权签发时,授权的是签发者(中间/CA),而不只是最终的叶。dns-caa-records 笔记记录了如何显式做这种授权。这篇是另一半:确认呈现的链确实经过那个签发者。

不破坏服务地检查链

只读探针在线上几乎不花成本:

$ echo | openssl s_client -connect www.xbcatm.com:443 -servername www.xbcatm.com -showcerts 2>/dev/null | grep 'BEGIN CERT' | wc -l
4

期望至少一张叶和一张中间证书。对公共 CA 而言,若链恰好只有一张证书而没有中间证书,说明边缘没有发送完整路径,应在信任发布前调查。

来源