Skip to content

HTTPS 深度解析

1. 核心概念

HTTP (HyperText Transfer Protocol) 是明文传输协议,存在被窃听、篡改、冒充的风险。 HTTPS = HTTP + SSL/TLS,在应用层(HTTP)和传输层(TCP)之间增加了一个安全层。

核心目标 (CIA)

  1. 机密性 (Confidentiality): 数据加密传输,防止窃听。
  2. 完整性 (Integrity): 数据未被篡改,防止中间人攻击。
  3. 身份认证 (Authentication): 验证服务器(或客户端)身份,防止伪装。

2. 加密技术基石

2.1 对称加密 (Symmetric Encryption)

  • 原理: 加密和解密使用同一个密钥
  • 特点: 计算速度快,效率高。
  • 算法: AES (Advanced Encryption Standard), ChaCha20。
  • 用途: 传输实际的应用数据。
  • 痛点: 密钥分发困难(如果直接传输密钥会被窃听)。

2.2 非对称加密 (Asymmetric Encryption)

  • 原理: 密钥成对出现(公钥 Public Key 和 私钥 Private Key)。
    • 公钥加密 -> 私钥解密
    • 私钥签名 -> 公钥验签
  • 特点: 计算复杂,速度慢(比对称加密慢约 1000 倍)。
  • 算法: RSA, ECC (Elliptic Curve Cryptography)。
  • 用途: 用于密钥交换(协商出对称密钥)和身份认证。

2.3 摘要算法 (Digest / Hashing)

  • 原理: 将任意长度数据映射为固定长度的哈希值。
  • 特点: 单向不可逆,雪崩效应。
  • 算法: SHA-256。
  • 用途: 验证数据完整性,生成签名。

3. 数字证书与信任链 (PKI)

客户端如何确信收到的 "公钥" 确实属于目标服务器(如 google.com),而不是黑客的?

3.1 组成

  • 公钥: 服务器的公钥。
  • 持有者信息: 域名 (CN/SAN),组织信息。
  • 颁发者信息: CA (Certificate Authority)。
  • 有效期: 开始和结束时间。
  • 数字签名: CA 用自己的私钥对上述信息生成的签名。

3.2 验证流程

  1. 客户端收到服务器证书。
  2. 根据证书中的颁发者 (Issuer),在本地操作系统/浏览器的 根证书信任存储 (Root Trust Store) 中查找对应的 CA 证书。
  3. 如果找到,用 CA 的公钥解密证书签名,得到摘要 H1。
  4. 客户端计算证书内容的摘要 H2。
  5. 对比 H1 和 H2。如果一致,说明证书未被篡改且确实由 CA 颁发。
  6. 检查证书有效期、吊销状态 (CRL/OCSP) 以及域名是否匹配。

4. TLS 握手流程 (Handshake)

4.1 TLS 1.2 完整握手 (2-RTT)

  1. Client Hello:
    • 支持的协议版本 (TLS 1.2)
    • 支持的加密套件列表 (Cipher Suites)
    • 随机数 Client Random
  2. Server Hello:
    • 确认使用的协议版本
    • 确认使用的加密套件
    • 随机数 Server Random
  3. Certificate: 服务器发送证书。
  4. Server Key Exchange: (可选,取决于加密套件,如 DH 算法) 发送密钥交换参数。
  5. Server Hello Done.
  6. Client Key Exchange: 客户端验证证书后,生成 Pre-Master Secret (或者 DH 参数),用公钥加密发送给服务器。
  7. Change Cipher Spec: 告知后续通信将加密。
  8. Finished: 发送之前所有握手消息的摘要(加密),供验证。
  9. Change Cipher Spec: 服务器告知后续通信将加密。
  10. Finished: 服务器发送握手摘要验证。

最终密钥生成: Master Secret = HMAC(Client Random, Server Random, Pre-Master Secret) Session Key 由 Master Secret 衍生。

4.2 TLS 1.3 的改进 (1-RTT)

TLS 1.3 大幅优化了握手流程,废弃了不安全的算法 (如 RSA 密钥交换,改用 ECDHE),减少了往返时延。

  1. Client Hello:
    • 包含 TLS 1.2 内容。
    • 直接猜测服务器支持的密钥交换算法 (Key Share),并发送自己的公钥 (DH 参数)。
  2. Server Hello:
    • 确认算法,发送自己的公钥 (DH 参数)。
    • Encrypted Extensions: 之前明文的扩展现在加密发送。
    • Certificate & Verify: 证书和签名。
    • Finished.
  3. Client Finished.

0-RTT 恢复: 如果之前建立过连接,客户端可以在 Client Hello 中直接发送加密的早期应用数据 (Early Data)。


5. 高级特性

5.1 SNI (Server Name Indication)

  • 问题: 一个 IP 托管多个域名时,服务器在握手阶段不知道客户端请求哪个域名,无法返回正确的证书。
  • 解决: Client Hello 扩展中携带目标域名 (Host Name),服务器根据此信息选择正确证书。

5.2 HSTS (HTTP Strict Transport Security)

  • 作用: 强制客户端在一段时间内(如一年)只使用 HTTPS 访问该域名。
  • 防御: 防止 SSL Strip (SSL 剥离攻击)。
  • Header: Strict-Transport Security: max-age=31536000; includeSubDomains

5.3 完美前向保密 (PFS - Perfect Forward Secrecy)

  • 定义: 即使服务器的长期私钥泄露,也无法解密之前的历史流量。
  • 实现: 必须使用临时密钥交换算法 (如 ECDHE),每次会话生成独立的临时密钥,长期私钥仅用于签名认证,不参与密钥协商。RSA 密钥交换不具备 PFS (因为私钥参与了 Pre-Master 解密)。

前端面试知识库