【SSL证书系列】客户端如何验证https网站服务器发的证书是否由受信任的根证书签发机构签发
客户端验证HTTPS网站证书是否由受信任的根证书颁发机构(CA)签发,是一个多步骤的过程,涉及证书链验证、信任锚(Trust Anchor)检查、域名匹配和吊销状态验证等。以下是详细的验证流程:
1. 证书链的构成
服务器发送的证书通常是一个证书链,包含:
• 服务器证书:网站的公钥证书(由中间CA签发)。
• 中间CA证书:由根CA签发的中间证书颁发机构(Intermediate CA)的证书。
• 根CA证书:根证书颁发机构的自签名证书(通常不直接发送,而是预装在客户端系统中)。
示例:
网站证书(由 Intermediate CA 签发)
→ Intermediate CA 证书(由 Root CA 签发)
→ Root CA 证书(预装在客户端中,作为信任锚)
2. 验证步骤
(1) 证书链完整性验证
• 客户端(浏览器/操作系统)从服务器接收证书链,逐级验证签名:
- 服务器证书:用中间CA的公钥验证其签名。
- 中间CA证书:用根CA的公钥验证其签名。
- 根CA证书:客户端内置的根证书列表中是否存在该根CA?若存在,则信任链成立。
(2) 信任锚(Trust Anchor)检查
• 客户端内置的根证书列表(Trust Store)是验证的核心:
• 操作系统或浏览器预装根证书:如Windows的“受信任的根证书颁发机构”、macOS的钥匙串访问、Chrome/Firefox的内置CA列表。
• 根CA证书必须是自签名的,且客户端明确信任它(例如用户手动安装的例外情况除外)。
(3) 证书有效期验证
• 检查证书的生效日期和过期时间,确保当前时间在有效期内。
(4) 域名匹配
• 证书中的Subject Alternative Name (SAN) 或 Common Name (CN) 必须与访问的域名一致(如 example.com
或 *.example.com
)。
(5) 吊销状态检查
• 客户端需检查证书是否被CA提前吊销:
• CRL(证书吊销列表):下载CA发布的吊销列表,检查证书序列号是否在其中。
• OCSP(在线证书状态协议):直接向CA的OCSP服务器发送请求,实时查询证书状态。
• OCSP Stapling:服务器定期从CA获取OCSP响应并缓存,在TLS握手时直接发送给客户端,避免客户端直接查询。
(6) 扩展用途验证
• 检查证书的扩展字段(如 Extended Usage
),确保证书类型适用于服务器身份认证(如 Server Authentication
)。
3. 受信任的根证书来源
客户端信任的根证书由以下途径维护:
-
操作系统内置:
• Windows:通过系统更新自动同步微软的根证书计划(Windows Root Certificate Program)。• macOS:钥匙串访问中预置的受信任根证书。
• Linux:发行版提供的根证书包(如
ca-certificates
包)。 -
浏览器内置:
• Chrome/Edge:使用操作系统的根证书库。• Firefox:独立维护自己的根证书列表(NSS数据库)。
-
用户手动导入:
• 用户可手动添加根证书(例如企业内网的自签名证书),但存在安全风险。
4. 验证失败的常见原因
• 证书链不完整:服务器未发送中间CA证书,导致客户端无法构建完整信任链。
• 根证书未预装:证书由私有CA签发,但客户端未信任该CA。
• 域名不匹配:证书中的域名与访问的域名不一致。
• 证书过期:证书已超过有效期。
• 吊销状态异常:证书已被CA吊销,且OCSP/CRL检查失败。
5. 示例:Let’s Encrypt 的证书验证
- Let’s Encrypt 使用中间CA(如
ISRG Root X1
)签发服务器证书。 - 客户端检查中间CA的签名是否由根CA(如
DST Root CA X3
或ISRG Root X1
)签发。 - 根CA是否在客户端的信任列表中?如果是,则验证成功。
6. 总结
客户端验证的核心逻辑是:
“服务器证书的签发路径必须最终链接到客户端信任的根CA,且所有中间环节均合法有效。”
如果任一环节失败(如证书链断裂、域名不匹配、吊销状态异常),客户端会提示安全警告(如“您的连接不是私密连接”)。