证书页面里列出好几个CA名字,最后一个还不是自签名证书,并不一定说明“证书链没配全”。服务器发送哪些证书,客户端利用哪些证书构建可信路径,是有关联但不同的两件事。排查链问题时,先看各项的颁发给、颁发者,再判断是否缺少中间证书。

先取得当前域名的真实报告

打开SSL检测,输入需要核对的域名后点击“立即检测”。本次使用公开域名 www.bt.cn,仅对这个域名执行检测,没有调整服务器证书配置。

输入公开域名,获取该域名当前的SSL检测结果
输入公开域名,获取该域名当前的SSL检测结果

进入证书信息,先确认看到的是目标网站的叶证书,而不是把中间CA误当作网站证书。本次通用名称为 *.bt.cn,颁发者为 sslTrus RSA OV SSL CA 2;页面同时列出了备用名称、签名算法、有效期和信任状态。证书到期、名称匹配和链信任各有判断条件,不应只看其中一项。

网站叶证书的颁发者、备用名称及信任状态
网站叶证书的颁发者、备用名称及信任状态

按颁发关系读链,别只数几张证书

本次“证书信任链”区域显示4个条目。从叶证书向后,依次能看到 sslTrus RSA OV SSL CA 2、Sectigo Public Server Authentication Root R46 和 USERTrust RSA Certification Authority。最后一个条目的颁发者是 AAA Certificate Services。

本次页面显示四个证书条目,最后一项的主体与颁发者并不相同
本次页面显示四个证书条目,最后一项的主体与颁发者并不相同

读每一项时,“颁发给”是这张证书的主体,“颁发者”是签发它的主体。下一项通常用于证明前一项的签名。名称里带Root,并不能单独证明这张具体证书就是客户端最终使用的自签根证书;同一主体可能存在不同颁发者、不同公钥或不同签名路径的证书。

本次报告末端的USERTrust证书由AAA签发,它体现的是交叉签名路径上的证书,不能仅凭“没有再显示AAA自签根”就判定缺链。需要核对的是客户端能否利用收到的证书及本地信任库,建立符合验证条件的路径。

发送链与验证路径可能不同

服务器在TLS握手中发送证书列表,第一项应是服务器自己的叶证书,后面通常带上需要的中间证书。信任锚由客户端通过独立渠道建立,常见情况是在系统或应用的证书库里预置根证书;它可以不在服务器发送的列表中。把根证书也一股脑追加到服务器文件,不会让原本不信任它的客户端自动变得信任。

为核对界面含义,本次还查看了同一轮公开检测响应。响应分别提供 peer_chain 与 certificate_details.verified_chain:前者末项是“USERTrust由AAA签发”,后者末项是“USERTrust由USERTrust签发”。页面截图中的4项与发送序列一致,而检测端验证路径以它信任的USERTrust证书收尾。

这两个序列不能互相冒充。它们条目数恰好相同,也不表示每张证书都一样;这里的差别就在末项的颁发者。读者日常使用先按页面核对主体和颁发者,遇到需要审计发送内容的情况,再保留同轮原始检测数据或用TLS抓取工具补证,别只截一个绿色提示。

“完整且受信任”还有客户端范围

本次页面提示当前证书链完整且受信任,说明这轮检测得到了相应判断。其他客户端的信任库、系统时间和验证实现可能不同,不能保证所有旧设备、容器或自带CA库的程序都能通过。浏览器能打开而某个客户端报错时,应保存后者的具体错误、实际访问域名和证书序列,再与这轮结果比较。

如果证实缺少中间证书,应按所用Web服务器的规则配置叶证书与正确中间证书,并重新加载配置后复测;如果是客户端不信任相应根,则需要核对该客户端的CA库和服务要求。不要把关闭验证当成补齐证书链,也不要只因为看到多个CA就删掉其中的交叉签名证书。先明确是发送材料缺失、名称不符,还是信任库差异,修正动作才有依据。