用户首先是SSL证书链验证。浏览器收到证书后,需要确认它是由可信CA签发的。这就像查家谱一样,得一级级往上追溯,直到找到根证书。根证书通常预装在操作系统或浏览器里,所以这一步的关键在于信任链的完整性。然后是有效期检查。接着是域名匹配,最后是CRL和OCSP这些吊销检查机制。因此浏览器验证SSL证书有效性的过程是一个严谨的“信任链”验证,涉及多个关键步骤,确保你连接的服务器的身份是真实的且通信是加密的。下面说一下核心步骤:
1. 接收服务器证书:
当你通过HTTPS访问一个网站时(例如 https://www.example.com),该网站的服务器会将其SSL/TLS证书发送给你的浏览器。
2. 验证证书链(信任链):
服务器证书通常不是由根证书颁发机构直接签发的,而是由中间CA签发的。证书链是从服务器证书开始,链接到中间CA证书,最终链接到受信任的根CA证书。
浏览器会检查收到的证书链是否完整且有效。
检查签名: 浏览器使用证书链中上一级证书的公钥来验证下一级证书的数字签名。例如:
用根CA证书的公钥验证中间CA证书的签名。
用中间CA证书的公钥验证服务器证书的签名。
验证根信任: 浏览器检查证书链顶端的根CA证书是否存在于其内置的受信任根证书颁发机构存储中。这个存储包含了操作系统或浏览器本身预装并信任的全球知名CA(如DigiCert, GlobalSign, Let's Encrypt等)的根证书。这是信任的基石。
3. 检查证书有效期:
浏览器检查服务器证书的生效日期和过期日期。
浏览器会确认当前时间是否在证书的有效期内。任何在有效期之外的证书都会被视为无效。
4. 验证域名匹配:
浏览器检查服务器证书中的 Subject Alternative Name 字段或 Common Name 字段(现代证书主要依赖SAN)。
它会核对你在地址栏中实际访问的域名是否与证书中列出的某个域名完全匹配。
支持通配符(如 *.example.com 匹配 blog.example.com 但不匹配 sub.blog.example.com 或 example.org)。
5. 检查证书吊销状态(可选但重要):
即使证书本身有效且由可信CA签发,它也可能因为私钥泄露、CA错误签发等原因被提前吊销。浏览器需要检查证书是否已被吊销。
主要有两种机制:
CRL - 证书吊销列表: CA定期发布一个包含所有已吊销证书序列号的列表。浏览器可以下载并检查该列表。缺点是列表可能很大且更新不及时。
OCSP - 在线证书状态协议: 浏览器直接向CA指定的OCSP响应器发送一个包含证书序列号的查询请求,实时获取该证书的吊销状态(“良好”、“已吊销”或“未知”)。这是目前更主流的方式。
OCSP Stapling: 为了提高效率和隐私,服务器可以在TLS握手过程中主动提供由CA签名的、包含其自身证书最新吊销状态的OCSP响应。浏览器验证这个签名的响应即可,无需直接连接CA的OCSP服务器。
6. 验证证书的扩展用途和关键性:
证书包含扩展字段,规定其用途(如 TLS Web Server Authentication)。浏览器会检查证书是否被授权用于服务器身份验证。
如果某个扩展被标记为关键(critical),而浏览器不理解或不支持该扩展,则必须拒绝该证书。
7. 最终结果:
所有检查通过: 浏览器地址栏会显示安全锁图标(通常为🔒),连接建立成功,所有通信被加密。对于扩展验证证书,锁图标旁边通常还会显示验证过的公司名称。
任何一项检查失败: 浏览器会弹出明显的安全警告页面(例如Chrome的“您的连接不是私密连接”),阻止用户继续访问(或强烈建议不要继续),并明确告知失败的具体原因(例如“证书已过期”、“证书不受信任”、“名称不匹配”或“证书已被吊销”)。
总结关键点:
信任锚点: 依赖预装的受信任根CA证书。
链式验证: 通过数字签名逐级验证证书链的完整性和真实性。
时效性: 确保证书在有效期内。
身份绑定: 确保证书绑定的域名与你访问的域名一致。
有效性状态: 检查证书是否被吊销(通过CRL/OCSP/OCSP Stapling)。
用途正确: 确保证书可用于服务器身份验证。
通过以上这个多层次的SSL证书验证过程是HTTPS安全性的核心保障,它让浏览器能够确认“你正在连接的就是你认为的那个服务器”,并为后续的加密通信打下信任基础。