HTTPS 加密原理

SSL/TLS 握手过程、对称与非对称加密、数字证书及中间人攻击防护

问题

解释 HTTPS 的加密原理,包括 SSL/TLS 握手过程、对称/非对称加密的作用、数字证书的验证机制,以及如何防止中间人攻击。

解答

对称加密与非对称加密

对称加密:
- 加密和解密使用同一把密钥
- 速度快,适合大量数据传输
- 问题:如何安全地传递密钥?

非对称加密:
- 公钥加密,私钥解密(或反过来)
- 速度慢,但解决了密钥传递问题
- 公钥可以公开,私钥必须保密

HTTPS 结合两者优点:用非对称加密交换密钥,用对称加密传输数据。

SSL/TLS 握手过程

客户端                                     服务器
   |                                         |
   |  1. ClientHello                         |
   |  (支持的TLS版本、加密套件、随机数A)      |
   | --------------------------------------> |
   |                                         |
   |  2. ServerHello                         |
   |  (选定的TLS版本、加密套件、随机数B)      |
   | <-------------------------------------- |
   |                                         |
   |  3. Certificate                         |
   |  (服务器数字证书)                        |
   | <-------------------------------------- |
   |                                         |
   |  4. 客户端验证证书                       |
   |  生成预主密钥(Pre-Master Secret)        |
   |  用服务器公钥加密后发送                  |
   | --------------------------------------> |
   |                                         |
   |  5. 双方用随机数A + 随机数B + 预主密钥   |
   |     生成相同的会话密钥                   |
   |                                         |
   |  6. 后续通信使用会话密钥对称加密         |
   | <=====================================> |

数字证书验证

数字证书包含:

  • 服务器公钥
  • 域名信息
  • 证书有效期
  • CA(证书颁发机构)的数字签名
验证流程:

1. 服务器发送证书
2. 客户端检查证书是否过期
3. 客户端检查证书域名是否匹配
4. 客户端用 CA 公钥验证证书签名
   - CA 公钥预装在浏览器/操作系统中
   - 签名验证通过 = 证书未被篡改
5. 验证通过,提取服务器公钥

证书链验证:

根证书 (Root CA)
    ↓ 签发
中间证书 (Intermediate CA)
    ↓ 签发
服务器证书 (End Entity)

客户端从下往上逐级验证,直到找到受信任的根证书

中间人攻击与防护

中间人攻击原理:

正常情况:
客户端 <=========> 服务器

中间人攻击:
客户端 <===> 攻击者 <===> 服务器
           (伪装成服务器)

攻击者尝试:

  1. 拦截客户端请求
  2. 向客户端发送伪造证书
  3. 与服务器建立另一个连接
  4. 解密、查看、篡改数据后转发

HTTPS 如何防护:

// 伪代码:证书验证逻辑
function verifyCertificate(cert) {
  // 1. 检查证书是否过期
  if (cert.notAfter < Date.now()) {
    return { valid: false, reason: '证书已过期' };
  }
  
  // 2. 检查域名是否匹配
  if (!cert.domains.includes(requestedDomain)) {
    return { valid: false, reason: '域名不匹配' };
  }
  
  // 3. 验证证书签名(核心防护)
  // 攻击者没有 CA 私钥,无法伪造有效签名
  const isSignatureValid = verifySignature(
    cert.tbsCertificate,  // 待签名的证书内容
    cert.signature,        // 证书签名
    caPublicKey           // CA 公钥(预装在系统中)
  );
  
  if (!isSignatureValid) {
    return { valid: false, reason: '证书签名无效' };
  }
  
  // 4. 检查证书是否被吊销(CRL/OCSP)
  if (isRevoked(cert)) {
    return { valid: false, reason: '证书已被吊销' };
  }
  
  return { valid: true };
}

攻击者无法成功的原因:

  1. 没有 CA 私钥 → 无法伪造受信任的证书
  2. 自签名证书 → 浏览器会显示安全警告
  3. 域名不匹配 → 验证失败

完整的 HTTPS 安全机制

┌─────────────────────────────────────────────────────┐
│                    HTTPS 安全保障                    │
├─────────────────────────────────────────────────────┤
│  机密性:对称加密保护数据内容                         │
│  完整性:MAC/HMAC 检测数据篡改                       │
│  身份认证:数字证书验证服务器身份                     │
│  防重放:随机数 + 序列号防止重放攻击                  │
└─────────────────────────────────────────────────────┘

关键点

  • 混合加密:非对称加密交换密钥,对称加密传输数据,兼顾安全与性能
  • 三个随机数:客户端随机数 + 服务器随机数 + 预主密钥,共同生成会话密钥
  • 证书链验证:从服务器证书逐级向上验证,直到受信任的根 CA
  • 中间人防护:攻击者没有 CA 私钥,无法伪造有效证书签名
  • 前向保密:使用 ECDHE 等算法,即使私钥泄露,历史通信仍安全