一次 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 而言,若链恰好只有一张证书而没有中间证书,说明边缘没有发送完整路径,应在信任发布前调查。
来源
- RFC 8446 — TLS 1.3,握手中的证书消息与呈现,已核验 2026-06-08。
- RFC 5280 — X.509 PKI,证书路径与信任锚点,已核验 2026-06-08。
- Let’s Encrypt: Certificate Chains,中间签发与链呈现,已核验 2026-06-08。
- OpenSSL
s_client,-showcerts链检查,已核验 2026-06-08。