Skip to content

HTTPS 证书验证完整流程

更新: 6/28/2026 字数: 0 字 时长: 0 分钟

证书验证的核心目标只有一句话:确认"我连的这个服务器,真的是它声称的那个网站,而且它的身份由我信任的机构担保过"。下面按浏览器实际执行的时间顺序拆开讲,每一步都说清楚校验通过会怎样、不通过又会怎样。

HTTPS 证书验证整体流程概览

1. 拿到服务器的证书链

TLS 握手阶段,客户端发出 ClientHello,服务器回 ServerHello 时会把自己的证书一并发过来。这里发的通常不是一张证书,而是一条证书链:服务器证书 + 一张或多张中间 CA 证书。

服务器一般不会把根证书也发过来,因为根证书早就预装在你的操作系统和浏览器里了。

  • 通过:拿到了完整的链,继续下一步。
  • 不通过:如果服务器只发了自己的证书、漏掉了中间证书(运维配置 Nginx 时很常见的坑),客户端可能补不齐这条链,最终报 unable to get local issuer certificate,握手失败。

2. 沿着信任链逐级验签

这是整个验证里最关键的一环。客户端要从服务器证书出发,一级一级往上找签发者,直到撞上一张自己本地信任的根证书为止。

证书信任链逐级验证

验证方向和签发方向正好相反:

  • 服务器证书由「中间 CA」签发,就用中间 CA 的公钥去验服务器证书的签名;

  • 中间 CA 证书由「根 CA」签发,就用根 CA 的公钥去验中间证书的签名;

  • 根 CA 证书是自签名的,它的公钥就在你系统的"受信任根证书库"里。链一旦接上这个根,信任就成立了。

  • 通过:每一级签名都对得上,且链顶端的根确实在本地信任库里。

  • 不通过:链断了、找不到受信任的根,浏览器直接判定证书不可信,弹出 NET::ERR_CERT_AUTHORITY_INVALID。自签证书报错就出在这里——它的根不在任何人的信任库里。

3. 用 CA 公钥验签:数字签名怎么对上的

第 2 步说的"验签",具体动作展开是这样:

CA 数字签名验签原理

CA 签发证书时,先对证书正文算一个哈希摘要,再用自己的私钥加密这个摘要,得到的就是证书上的"数字签名"。客户端验证时做两件事:

  1. 用同样的哈希算法,对收到的证书正文重新算一遍摘要;
  2. 用 CA 的公钥解开证书上的数字签名,还原出 CA 当初算的那个摘要。

把这两个摘要一比:

  • 一致:说明证书自签发后没被篡改过,而且签名确实是用对应私钥生成的——签名可信。
  • 不一致:证书内容被人改过,或者签名是伪造的,验证失败,握手中断。

私钥只有 CA 自己有,别人伪造不出能被公钥正确解开的签名,这就是信任的数学基础。

4. 校验域名、有效期与吊销状态

签名验过了,只能证明"这张证书是真 CA 发的、没被改过",还不能直接用。客户端还要确认这张证书是发给当前这个网站的、现在还有效、并且没被提前作废

证书域名、有效期与吊销校验

域名匹配:拿浏览器地址栏的域名,去比对证书里的 SAN(Subject Alternative Name)字段。现代浏览器只认 SAN,早已不看老的 CN 字段。

  • 匹配上 → 通过;
  • 对不上(比如证书签给 a.com,你却访问 b.com)→ 报 NET::ERR_CERT_COMMON_NAME_INVALID,拒绝连接。

有效期检查:看当前时间是否落在证书的 Not BeforeNot After 之间。

  • 在区间内 → 通过;
  • 过期或还没生效 → 报 NET::ERR_CERT_DATE_INVALID。顺带一提,本机系统时间错乱也会误触发这个错误。

吊销状态查询:有些证书会在到期前被 CA 主动作废(比如私钥泄露)。客户端通过 OCSP 或 CRL 查这张证书在不在"黑名单"里。

  • 未被吊销 → 通过;
  • 已吊销 → 拒绝连接。实际中很多浏览器对吊销检查采取"软失败"策略:查询超时或查不到时,不会一律拦截,以免影响可用性。

全部通过之后

四关全过,客户端才认定服务器身份可信,接着用证书里的公钥完成密钥交换,协商出本次会话的对称密钥,握手结束,开始加密通信。任何一关没过,连接都会被掐断或弹出醒目的安全警告,把决定权交还给用户。

流程速查

步骤校验内容通过结果不通过结果
1 获取证书链服务器证书 + 中间证书是否齐全进入验签unable to get local issuer 握手失败
2 信任链验证能否逐级接到本地信任根信任成立ERR_CERT_AUTHORITY_INVALID
3 签名验签重算摘要与解密摘要是否一致内容未篡改、签名可信验证失败、握手中断
4a 域名匹配地址栏域名是否在 SAN 中通过ERR_CERT_COMMON_NAME_INVALID
4b 有效期当前时间是否在有效区间通过ERR_CERT_DATE_INVALID
4c 吊销状态OCSP/CRL 是否在黑名单通过拒绝连接(多为软失败)