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

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 的公钥解开证书上的数字签名,还原出 CA 当初算的那个摘要。
把这两个摘要一比:
- 一致:说明证书自签发后没被篡改过,而且签名确实是用对应私钥生成的——签名可信。
- 不一致:证书内容被人改过,或者签名是伪造的,验证失败,握手中断。
私钥只有 CA 自己有,别人伪造不出能被公钥正确解开的签名,这就是信任的数学基础。
4. 校验域名、有效期与吊销状态
签名验过了,只能证明"这张证书是真 CA 发的、没被改过",还不能直接用。客户端还要确认这张证书是发给当前这个网站的、现在还有效、并且没被提前作废。

域名匹配:拿浏览器地址栏的域名,去比对证书里的 SAN(Subject Alternative Name)字段。现代浏览器只认 SAN,早已不看老的 CN 字段。
- 匹配上 → 通过;
- 对不上(比如证书签给
a.com,你却访问b.com)→ 报NET::ERR_CERT_COMMON_NAME_INVALID,拒绝连接。
有效期检查:看当前时间是否落在证书的 Not Before 和 Not 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 是否在黑名单 | 通过 | 拒绝连接(多为软失败) |