题目
HTTPS握手过程中,客户端如何验证服务器证书的有效性?
信息
- 类型:问答
- 难度:⭐⭐
考点
HTTPS握手流程,证书验证原理,公钥基础设施(PKI)
快速回答
客户端验证服务器证书需要完成以下关键步骤:
- 检查证书是否在有效期内
- 验证证书颁发机构(CA)是否受信任
- 核对证书域名与实际访问域名是否匹配
- 确保证书链完整且未被吊销(通过CRL或OCSP)
- 验证证书签名合法性
原理说明
在HTTPS握手阶段(TLS/SSL握手),服务器发送其数字证书给客户端。客户端需通过PKI(公钥基础设施)体系验证证书:
- 证书链验证:从服务器证书回溯到根CA证书,逐级验证签名
- 吊销检查:通过CRL(证书吊销列表)或OCSP(在线证书状态协议)确认证书未被撤销
- 域名匹配:检查证书中的Subject Alternative Name (SAN) 或Common Name (CN) 是否匹配当前域名
关键验证步骤代码逻辑
// 伪代码演示验证流程
function verifyCertificate(serverCert) {
// 1. 检查有效期
if (serverCert.notBefore > now || serverCert.notAfter < now) {
throw "证书过期";
}
// 2. 构建证书链并验证签名
const certChain = buildChain(serverCert); // 包含中间CA和根CA
for (let i = 0; i < certChain.length - 1; i++) {
if (!verifySignature(certChain[i], certChain[i+1].publicKey)) {
throw "证书签名无效";
}
}
// 3. 检查根CA是否受信任
const rootCA = certChain[certChain.length-1];
if (!trustedRootCAs.includes(rootCA)) {
throw "不受信的证书颁发机构";
}
// 4. 域名验证
if (!serverCert.domains.includes(currentDomain)) {
throw "域名不匹配";
}
// 5. 吊销检查(OCSP示例)
const ocspResponse = fetchOCSP(serverCert);
if (ocspResponse.status === "REVOKED") {
throw "证书已被吊销";
}
}最佳实践
- 证书配置:服务器应包含完整证书链(服务证书+中间CA证书)
- 吊销检查:启用OCSP Stapling减少延迟,由服务器提供OCSP响应
- HSTS:通过HTTP Strict Transport Security头强制HTTPS
- 密钥交换:使用ECDHE密钥交换实现前向保密
常见错误
- 服务器未发送中间CA证书导致证书链不完整
- 证书域名与网站域名不匹配(如www.example.com vs example.com)
- 忽略证书过期问题(尤其Let's Encrypt证书90天有效期)
- 未及时更新CRL/OCSP缓存导致已吊销证书通过验证
扩展知识
- 证书透明度(CT):通过公开日志系统监测恶意证书
- mTLS:双向证书验证用于服务间认证
- HPKP淘汰:由于风险问题,HTTP公钥钉扎已被现代浏览器弃用
- QUIC协议:HTTP/3中TLS握手整合到QUIC连接建立过程