当前位置: 首页 > ai >正文

【SSL证书系列】客户端如何验证https网站服务器发的证书是否由受信任的根证书签发机构签发

客户端验证HTTPS网站证书是否由受信任的根证书颁发机构(CA)签发,是一个多步骤的过程,涉及证书链验证、信任锚(Trust Anchor)检查、域名匹配和吊销状态验证等。以下是详细的验证流程:


1. 证书链的构成
服务器发送的证书通常是一个证书链,包含:
• 服务器证书:网站的公钥证书(由中间CA签发)。

• 中间CA证书:由根CA签发的中间证书颁发机构(Intermediate CA)的证书。

• 根CA证书:根证书颁发机构的自签名证书(通常不直接发送,而是预装在客户端系统中)。

示例:

网站证书(由 Intermediate CA 签发)  
→ Intermediate CA 证书(由 Root CA 签发)  
→ Root CA 证书(预装在客户端中,作为信任锚)

2. 验证步骤
(1) 证书链完整性验证
• 客户端(浏览器/操作系统)从服务器接收证书链,逐级验证签名:

  1. 服务器证书:用中间CA的公钥验证其签名。
  2. 中间CA证书:用根CA的公钥验证其签名。
  3. 根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. 受信任的根证书来源
客户端信任的根证书由以下途径维护:

  1. 操作系统内置:
    • Windows:通过系统更新自动同步微软的根证书计划(Windows Root Certificate Program)。

    • macOS:钥匙串访问中预置的受信任根证书。

    • Linux:发行版提供的根证书包(如 ca-certificates 包)。

  2. 浏览器内置:
    • Chrome/Edge:使用操作系统的根证书库。

    • Firefox:独立维护自己的根证书列表(NSS数据库)。

  3. 用户手动导入:
    • 用户可手动添加根证书(例如企业内网的自签名证书),但存在安全风险。


4. 验证失败的常见原因
• 证书链不完整:服务器未发送中间CA证书,导致客户端无法构建完整信任链。

• 根证书未预装:证书由私有CA签发,但客户端未信任该CA。

• 域名不匹配:证书中的域名与访问的域名不一致。

• 证书过期:证书已超过有效期。

• 吊销状态异常:证书已被CA吊销,且OCSP/CRL检查失败。


5. 示例:Let’s Encrypt 的证书验证

  1. Let’s Encrypt 使用中间CA(如 ISRG Root X1)签发服务器证书。
  2. 客户端检查中间CA的签名是否由根CA(如 DST Root CA X3ISRG Root X1)签发。
  3. 根CA是否在客户端的信任列表中?如果是,则验证成功。

6. 总结
客户端验证的核心逻辑是:
“服务器证书的签发路径必须最终链接到客户端信任的根CA,且所有中间环节均合法有效。”
如果任一环节失败(如证书链断裂、域名不匹配、吊销状态异常),客户端会提示安全警告(如“您的连接不是私密连接”)。

http://www.xdnf.cn/news/6088.html

相关文章:

  • 【原创】使用阿里云存放一个临时共享的文件
  • FunASR:语音识别与合成一体化,企业级开发实战详解
  • 论MCU如何在Fatfs中使用Flash接口的方法
  • 前端面试每日三题 - Day 34
  • 白盒测试——基本路径测试法
  • copy_paste
  • 如何实现一个运动会计分系统?(C语言版)
  • 高速系统设计实例设计分析二
  • Java—类与对象(一)
  • LLM(大语言模型)部署加速方法——PagedAttention
  • c# 倒序方法
  • 【Java】 volatile 和 synchronized 的比较及使用场景
  • 【RabbitMQ】路由模式和通配符模式的具体实现
  • 嵌入式培训之数据结构学习(三)gdb调试
  • dify 连接不上ollama An error occurred during credentials validation:
  • gitlab提交测试分支的命令和流程
  • HCIP(BFD)
  • Linux——CMake的快速入门上手和保姆级使用介绍、一键执行shell脚本
  • 硬盘序列号(SN码)4种常用查询方法分享
  • Java基础之静态代理和动态代理
  • ValueError: 4 columns passed, passed data had 51141 columns解决
  • 【消息队列】RabbitMQ基本认识
  • Git仓库迁移
  • 深度解析 Sora:从技术原理到多场景实战的 AI 视频生成指南【附学习资料包下载】
  • 模糊数学方法之模糊贴近度
  • 现代 Web 自动化测试框架对比:Playwright 与 Selenium 的深度剖析
  • AI智能分析网关V4周界入侵检测算法精准监测与智能分析,筑牢周界安全防线
  • flutter 视频通话flutter_webrtc
  • @Controller 与 @RestController-笔记
  • 架构设计不合理,如何优化系统结构