mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
1674 字
5 分钟
为什么 HTTPS 需要证书
2024-04-10

HTTPS 通过 TLS/SSL 协议为 HTTP 提供了安全保护,但仅有加密是不够的。如果没有证书,HTTPS 将无法验证服务器身份,用户可能正与攻击者通信而不自知。本文深入解析 PKI 证书体系的设计原理。

一、HTTPS 的安全目标#

1.1 三大安全属性#

HTTPS 需要保障三个核心安全属性:

mindmap root((HTTPS 安全目标)) 机密性 Confidentiality 数据加密传输 防止窃听 对称加密算法 完整性 Integrity 数据未被篡改 消息认证码 MAC 防止中间人修改 身份认证 Authentication 验证服务器身份 防止冒充 数字证书
安全属性威胁防护机制核心技术
机密性数据被窃听加密传输AES、ChaCha20
完整性数据被篡改消息认证码HMAC、AEAD
认证性身份被冒充数字证书PKI、X.509

1.2 为什么加密不够?#

很多人会有疑问:既然 HTTPS 使用加密传输,为什么还需要证书?

sequenceDiagram participant U as 用户 participant E as 攻击者 participant S as 真实服务器 Note over U,S: 场景:只有加密,没有证书验证 U->>E: 你是 example.com 吗? E->>U: 是的!(冒充) Note over U,E: 攻击者生成假密钥 E->>U: 这是我的公钥(假的) U->>E: 用公钥加密数据 E->>U: 解密成功!窃取数据 Note over U,E: 攻击者同时与真实服务器通信 E->>S: 转发请求 S->>E: 响应数据 E->>U: 返回响应 Note over U,E: 攻击者成功窃听和篡改!

关键问题:加密只能保护数据不被窃听,但无法验证通信对方的身份。如果用户与攻击者建立了加密连接,数据确实加密了,但接收者是攻击者而非目标服务器。

二、中间人攻击详解#

2.1 攻击原理#

中间人攻击(Man-in-the-Middle Attack,MITM)是 HTTPS 最核心的威胁模型:

flowchart TB subgraph 正常通信 A1[用户] <-->|加密通信| B1[真实服务器] end subgraph 中间人攻击 A2[用户] <-->|加密通信| E2[攻击者] E2 <-->|加密通信| B2[真实服务器] E2 -->|窃听/篡改| D[获取明文数据] end style E2 fill:#f66 style D fill:#f66

2.2 攻击场景#

攻击场景攻击方式危害程度
公共 WiFiDNS 欺骗 + 假 AP
ARP 欺骗局域网流量劫持
恶意代理用户主动配置的代理
证书伪造自签名证书欺骗
CA 泄露签发虚假证书极高

2.3 没有证书时的攻击流程#

sequenceDiagram participant C as 客户端 participant A as 攻击者 participant S as 服务器 Note over C,S: 攻击者拦截通信 C->>A: ClientHello A->>C: ServerHello + 假公钥 Note over C: 客户端无法验证公钥真伪 C->>A: 用假公钥加密的预主密钥 A->>C: 解密成功,获得会话密钥 Note over A: 攻击者同时连接真实服务器 A->>S: ClientHello S->>A: ServerHello + 真公钥 A->>S: 用真公钥加密的预主密钥 Note over C,A,S: 攻击者完全掌控双向通信

三、PKI 公钥基础设施#

3.1 什么是 PKI?#

PKI(Public Key Infrastructure,公钥基础设施)是一套用于管理数字证书的体系结构:

flowchart TB subgraph PKI 架构 CA[证书颁发机构<br/>Certificate Authority] RA[注册机构<br/>Registration Authority] VA[验证机构<br/>Validation Authority] RE[证书库<br/>Repository] end subgraph 证书生命周期 A1[申请] --> A2[验证] A2 --> A3[签发] A3 --> A4[使用] A4 --> A5[更新/撤销] end CA --> A3 RA --> A2 VA --> A2 RE --> A4 style CA fill:#4a9 style RA fill:#49a style VA fill:#49a

3.2 PKI 核心组件#

组件职责例子
CA签发和管理证书DigiCert、Let’s Encrypt
RA验证申请者身份CA 的分支机构
证书库存储有效证书LDAP、数据库
CRL/OCSP证书撤销状态查询在线验证服务
终端实体证书持有者(服务器/用户)网站服务器

3.3 信任模型#

PKI 采用层级信任模型:

flowchart TB Root[根 CA<br/>Root CA] Root --> I1[中间 CA 1] Root --> I2[中间 CA 2] I1 --> L1[叶子证书 1] I1 --> L2[叶子证书 2] I2 --> L3[叶子证书 3] I2 --> L4[叶子证书 4] style Root fill:#f96 style I1 fill:#ff9 style I2 fill:#ff9 style L1 fill:#9f9 style L2 fill:#9f9 style L3 fill:#9f9 style L4 fill:#9f9

四、数字证书的结构#

4.1 X.509 证书格式#

X.509 是数字证书的国际标准,定义了证书的结构:

flowchart TB subgraph 证书结构 V[版本号 Version] SN[序列号 Serial Number] A[签名算法 Signature Algorithm] I[颁发者 Issuer] VD[有效期 Validity] S[使用者 Subject] PK[公钥信息 Public Key] E[扩展 Extensions] SIG[签名 Signature] end V --> SN --> A --> I --> VD --> S --> PK --> E --> SIG style V fill:#e1f5fe style SN fill:#e1f5fe style A fill:#fff3e0 style I fill:#f3e5f5 style VD fill:#e8f5e9 style S fill:#f3e5f5 style PK fill:#fce4ec style E fill:#fff8e1 style SIG fill:#ffebee

4.2 证书字段详解#

字段说明例子
Version证书版本v3(当前版本)
Serial Number证书唯一序列号0x01:23:45:67:89:AB:CD
Signature Algorithm签名算法SHA256withRSA、ECDSA
Issuer颁发者 DNCN=DigiCert Global Root CA
Validity有效期2024-01-01 至 2025-01-01
Subject使用者 DNCN=example.com
Public Key公钥信息RSA 2048 位公钥
Extensions扩展信息密钥用途、备用名称
SignatureCA 签名颁发者的数字签名

4.3 重要扩展字段#

mindmap root((证书扩展)) 密钥用途 Key Usage 数字签名 密钥加密 数据加密 证书签发 扩展密钥用途 Extended Key Usage 服务器认证 客户端认证 代码签名 邮件加密 主体备用名称 SAN DNS 名称 IP 地址 邮箱地址 基本约束 Basic Constraints 是否为 CA 证书链深度

4.4 实际证书示例#

Certificate:
Data:
Version: 3 (0x2)
Serial Number: 0e:8b:f8:4c:12:34:56:78
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, O=DigiCert Inc, CN=DigiCert Global Root CA
Validity
Not Before: Jan 1 00:00:00 2024 GMT
Not After : Jan 1 23:59:59 2025 GMT
Subject: C=CN, ST=Beijing, L=Beijing, O=Example Inc, CN=example.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus: 00:b4:a3:...(省略)
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
X509v3 Extended Key Usage:
TLS Web Server Authentication
X509v3 Subject Alternative Name:
DNS:example.com, DNS:www.example.com
Signature Algorithm: sha256WithRSAEncryption
Signature: 5a:3b:...(省略)

五、证书链与信任锚#

5.1 证书链结构#

证书链是从终端证书到根证书的信任路径:

flowchart BT subgraph 证书链验证 LC[终端证书<br/>Leaf Certificate<br/>example.com] IC[中间证书<br/>Intermediate CA<br/>DigiCert Secure Server CA] RC[根证书<br/>Root CA<br/>DigiCert Global Root CA] TR[信任存储<br/>Trust Store] end LC -->|签名者| IC IC -->|签名者| RC RC -->|预置信任| TR style LC fill:#9f9 style IC fill:#ff9 style RC fill:#f96 style TR fill:#9cf

5.2 证书链验证流程#

sequenceDiagram participant C as 客户端 participant S as 服务器 participant TS as 信任存储 participant OCSP as OCSP 服务器 S->>C: 发送证书链 [终端证书, 中间证书] Note over C: 1. 检查证书有效期 Note over C: 2. 检查域名匹配 C->>TS: 查找根证书 TS->>C: 返回信任的根证书列表 Note over C: 3. 验证中间证书签名 Note over C: 4. 验证终端证书签名 C->>OCSP: 查询证书撤销状态 OCSP->>C: 返回有效/已撤销 Note over C: 5. 验证通过,建立连接

5.3 为什么需要证书链?#

原因说明
安全隔离根证书离线存储,减少泄露风险
分层管理中间 CA 可独立运营,降低管理复杂度
撤销控制可撤销中间证书而不影响根证书
信任分发客户端只需信任少量根证书

5.4 信任锚(Trust Anchor)#

flowchart LR subgraph 浏览器/操作系统信任存储 R1[根证书 1] R2[根证书 2] R3[根证书 ...] Rn[根证书 N] end subgraph 互联网 S1[网站 A] S2[网站 B] S3[网站 C] end R1 -.->|信任链| S1 R2 -.->|信任链| S2 R3 -.->|信任链| S3 style R1 fill:#f96 style R2 fill:#f96 style R3 fill:#f96

主流浏览器和操作系统预置了约 150-200 个根证书,构成信任锚。

六、CA 的工作原理#

6.1 证书签发流程#

sequenceDiagram participant A as 申请者 participant RA as 注册机构 participant CA as 证书颁发机构 participant DB as 证书库 A->>RA: 提交证书申请 + CSR Note over RA: CSR 包含公钥和域名信息 RA->>RA: 验证域名所有权 Note over RA: DNS 验证 / HTTP 验证 / 邮件验证 RA->>CA: 验证通过,请求签发 CA->>CA: 生成证书 Note over CA: 用 CA 私钥签名 CA->>DB: 发布证书 CA->>A: 返回签发的证书 A->>A: 安装证书到服务器

6.2 域名验证方式#

验证方式流程适用场景
DNS 验证添加特定 TXT 记录自动化部署
HTTP 验证上传验证文件到 /.well-known/简单部署
邮件验证发送验证邮件到域名邮箱企业证书
OV/EV组织验证/扩展验证高安全需求

6.3 证书类型#

flowchart TB subgraph 证书类型 DV[域名验证 DV<br/>Domain Validation] OV[组织验证 OV<br/>Organization Validation] EV[扩展验证 EV<br/>Extended Validation] end DV --> D1[验证域名所有权] DV --> D2[快速签发<br/>几分钟] DV --> D3[仅显示域名] OV --> O1[验证组织真实性] OV --> O2[人工审核<br/>几天] OV --> O3[显示组织名称] EV --> E1[严格身份验证] EV --> E2[详细审核<br/>数周] EV --> E3[显示组织名称和地址] style DV fill:#9f9 style OV fill:#ff9 style EV fill:#f96

6.4 证书撤销#

当私钥泄露或证书信息变更时,需要撤销证书:

flowchart LR subgraph 撤销机制 CRL[证书撤销列表<br/>Certificate Revocation List] OCSP[在线证书状态协议<br/>OCSP] OCSP_S[OCSP Stapling] end CRL --> L1[定期下载列表] CRL --> L2[列表可能很大] OCSP --> O1[实时查询] OCSP --> O2[隐私问题] OCSP_S --> S1[服务器缓存响应] OCSP_S --> S2[减少客户端请求] style OCSP_S fill:#9f9
机制优点缺点
CRL离线可验证列表大、更新延迟
OCSP实时状态隐私泄露、额外请求
OCSP Stapling隐私保护、减少请求服务器需支持

七、证书验证完整流程#

7.1 TLS 握手中的证书验证#

sequenceDiagram participant C as 客户端 participant S as 服务器 participant TS as 信任存储 participant O as OCSP/CRL Note over C,S: TLS 握手阶段 C->>S: ClientHello S->>C: ServerHello + Certificate Note over C: 收到证书链 [Leaf, Intermediate] rect rgb(240, 248, 255) Note over C: 证书验证开始 C->>C: 1. 检查证书有效期 C->>C: 2. 检查域名是否匹配 C->>C: 3. 检查密钥用途 C->>TS: 4. 查找信任的根证书 TS->>C: 返回根证书 C->>C: 5. 验证签名链 C->>O: 6. 检查撤销状态 O->>C: 返回状态 end alt 验证通过 C->>S: 继续握手 Note over C,S: 建立加密通道 else 验证失败 C->>C: 显示警告或终止连接 end

7.2 验证步骤详解#

步骤检查内容失败后果
有效期检查当前时间在 NotBefore 和 NotAfter 之间证书过期警告
域名匹配证书 CN 或 SAN 包含目标域名域名不匹配警告
密钥用途Key Usage 包含服务器认证用途不符警告
签名验证用上级证书公钥验证签名不可信证书警告
根证书信任根证书在信任存储中未知颁发者警告
撤销检查证书未被撤销证书已撤销警告

7.3 证书固定(Certificate Pinning)#

为防止 CA 泄露或妥协,可采用证书固定:

flowchart TB subgraph 证书固定 HPKP[HTTP Public Key Pinning<br/>已废弃] CT[证书透明度<br/>Certificate Transparency] HPKP2[应用层固定<br/>App Pinning] end HPKP --> H1[浏览器不再支持] CT --> C1[所有证书公开记录] CT --> C2[可审计可追踪] HPKP2 --> A1[App 内置证书指纹] HPKP2 --> A2[绕过系统信任存储] style HPKP fill:#f99 style CT fill:#9f9 style HPKP2 fill:#9f9

7.4 证书透明度(CT)#

sequenceDiagram participant CA as 证书颁发机构 participant CT as CT 日志服务器 participant M as 监控服务 participant D as 域名所有者 CA->>CT: 提交预证书 CT->>CA: 返回 SCT(签名证书时间戳) Note over CA: SCT 嵌入证书或通过扩展提供 CA->>CA: 签发最终证书 CA->>M: 证书公开可查 M->>D: 监控到新证书签发 D->>D: 检查是否为非法签发 alt 发现非法证书 D->>CA: 投诉并请求撤销 end

CT 的作用

  1. 公开透明:所有证书公开可查
  2. 快速发现:非法签发可被及时发现
  3. 责任追溯:CA 行为可审计

八、实际案例分析#

8.1 DigiNotar 事件#

2011 年,DigiNotar CA 被攻击者入侵,签发了大量虚假证书:

flowchart LR A[攻击者入侵 DigiNotar] --> B[签发伪造证书] B --> C[*.google.com] B --> D[*.mozilla.org] B --> E[其他高价值域名] C --> F[伊朗用户被监控] D --> F E --> F F --> G[浏览器移除 DigiNotar 根证书] G --> H[DigiNotar 破产] style A fill:#f66 style F fill:#f66 style H fill:#f66

8.2 事件启示#

教训改进措施
单一 CA 信任风险引入 CT 机制
缺乏透明度所有证书必须公开记录
撤销不及时强制 OCSP/CRL 检查
信任链过长减少中间 CA 层级

8.3 Let’s Encrypt 的创新#

Let’s Encrypt 通过自动化和免费策略,大幅提升了 HTTPS 普及率:

flowchart TB subgraph Let's Encrypt 流程 A[ACME 客户端<br/>Certbot 等] --> B[申请证书] B --> C[域名验证<br/>DNS/HTTP] C --> D[自动签发] D --> E[自动安装] E --> F[自动续期<br/>90 天有效期] end style A fill:#9f9 style F fill:#9f9

关键创新

  • 自动化:ACME 协议实现全流程自动化
  • 免费:消除成本障碍
  • 透明:所有证书记录在 CT 日志
  • 短有效期:90 天自动续期,减少私钥泄露风险

九、总结#

9.1 为什么 HTTPS 需要证书?#

mindmap root((HTTPS 需要证书)) 解决身份认证问题 防止中间人攻击 验证服务器身份 建立信任链 构建信任体系 PKI 基础设施 分层管理 可追溯可审计 保障安全通信 加密基础 防篡改 防重放

9.2 关键要点#

问题解决方案技术
如何验证身份?数字证书X.509
如何信任证书?证书链 + 信任锚PKI
如何防止伪造?CA 签名RSA/ECDSA
如何发现非法证书?证书透明度CT Logs
如何撤销证书?CRL/OCSP在线验证

9.3 最佳实践#

  1. 使用可信 CA:选择受信任的证书颁发机构
  2. 启用 CT:确保证书记录公开透明
  3. 配置 OCSP Stapling:提高验证效率
  4. 自动化续期:避免证书过期
  5. 监控证书状态:及时发现异常签发

参考资料#

支持与分享

如果这篇文章对你有帮助,欢迎支持作者或分享给更多人

为什么 HTTPS 需要证书
https://blog.souloss.com/posts/why-the-design/why-https-needs-certificates/
作者
Souloss
发布于
2024-04-10
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时