← 返回文章列表

证书链与信任锚:浏览器凭什么信你

TLS安全入门

信任是怎么建立的

浏览器内置一批根证书(信任锚)。服务器出示的证书由某个中间 CA 签发,中间 CA 又由根 CA 签发。浏览器沿着这条链一路验到信任的根,才算可信。

证书链

角色说明
根证书自签名,预置在系统 / 浏览器,绝不外发私钥
中间证书根签发,用来签服务器证书,保护根私钥
服务器证书你的域名证书,由中间 CA 签发

两个常见部署错误

  1. 只发服务器证书:浏览器凑不齐链会报「不受信任」,必须连同中间证书一起下发;
  2. 链顺序错:服务器应把叶子证书放最前、中间证书随后,顺序错有的客户端不认。

验证

用 openssl s_client -showcerts 看服务端实际下发的链是否完整。证书内容本身是 ASN.1 结构,也可做 Base64 观察。

动手试试

观察 Base64 编码:Base64 编解码。

实战案例:三个“证书看着没问题”的故障

  1. 中间证书缺失:只在服务器部署站点证书,桌面浏览器会补链,部分安卓与命令行客户端却报 unable to get local issuer certificate。部署时必须带完整链。
  2. 根证书轮换未同步:CA 更换根证书后未更新信任库与服务器链,部分客户端开始报错。应关注 CA 的轮换公告并预留过渡期。
  3. 自建 CA 未下发根证书:内网服务换成自签证书,客户端未预置根证书,立刻全线告警。自建 CA 必须把根证书分发到所有客户端的信任库。

常见问题(FAQ)

证书链里都有什么?站点(叶)证书、若干中间证书,直至根证书;根证书预置在客户端信任库中,不随连接下发。为什么浏览器能打开、脚本却报错?浏览器会尝试补链或允许用户点过,命令行客户端则严格校验整条链与主机名。什么是信任锚?信任库中被无条件信任的根(或中间)证书,是整条链验证的起点。怎么快速自查?用 openssl s_client -showcerts 查看服务端实际下发的链,确认是否包含中间证书。

证书运维的例行清单

证书问题往往不是技术难题,而是流程遗漏。把下面几件事变成例行动作,能避免绝大多数突发故障。

  1. 到期时间集中登记:把全部证书的到期时间汇总到一处并设告警,包括容易被遗忘的内部服务、测试环境与第三方回调域名。分散在各个团队手里的证书最容易到期无人知。
  2. 续签自动化并验证:自动续签后必须验证新证书已实际生效,而不是只看任务执行成功。常见的情况是续签成功但服务未重新加载,仍然沿用旧证书直到过期。
  3. 链完整性纳入发布检查:每次部署后用命令行工具核对服务端实际下发的证书链,确认包含中间证书,避免只在个别客户端上暴露问题。
  4. 变更要有回滚路径:更换证书或更换签发机构时,应先保留旧证书一段时间,确认新证书在所有客户端可用后再移除。
  5. 记录信任库差异:不同客户端信任的根证书集合并不相同,尤其是移动端与老旧设备,应在灰度中覆盖这些群体。

排查顺序建议

遇到证书相关报错时,建议按“客户端提示的错误码 → 服务端实际下发的链 → 主机名与有效期 → 客户端信任库”的顺序排查。多数问题在前两步就能定位,后两步主要用于确认少数客户端特有的差异。

与自动化发布的结合

把证书与密钥纳入基础设施即代码的管理范围,签发、部署与更新都通过流水线完成,避免手工上传带来的版本不明与遗漏。同时把证书文件视为敏感信息,做好访问控制与审计,不与应用代码存放在同一仓库。