术语表

证书链 (Certificate Chain,信任链)

最后核实

定义

证书链是从网站终端证书经中间证书一直到受信任根证书的有序证书序列,每一张都由下一张签名。

证书链是客户端把服务器的终端证书连接到其 信任库 中某个 根证书 的一串证书:每张证书的颁发者名称等于下一张的主体名称,签名可以用下一张证书的公钥验证。服务器负责发送终端证书和中间证书,根证书由客户端本地提供,验证路径由客户端自己构建。

为什么重要

路径验证会检查链上每一环:签名、有效期、基本约束、名称约束、密钥用途,以及条件允许时的吊销状态。缺少中间证书、中间证书过期或顺序错乱,客户端就会报“unable to get local issuer certificate”等错误。由于存在 交叉签名,同一张证书可能有多条合法路径,不同客户端会选择不同的路径,这就是为什么同一个网站在新手机上正常、在老旧安卓设备上却报错。在宝塔面板、云负载均衡或 CDN 上部署时,证书一栏要填完整链,而不是只填网站证书。

例子

openssl s_client -connect example.com:443 -servername example.com -showcerts </dev/null

查看输出中编号的 s:(主体)和 i:(颁发者)行,每个 i: 都应等于下一张证书的 s:。

常见误区

  • 证书链文件里必须包含根证书。 根证书可有可无,客户端也不会因为服务器发送了它就信任它,终端证书加中间证书就够了。
  • 证书顺序无所谓。 应当网站证书在前、各级签发者依次在后;有的客户端能容忍乱序,有的不能。
  • 证书链验证通过就说明域名匹配。 链验证和域名匹配是两个独立的检查步骤,两者都必须通过。

延伸阅读