网络与协议 · 51/72
1. Ajax、Axios、Fetch 对比 2. Ajax 原理 3. Ajax 技术与实现 4. 常见的应用层协议 5. 浏览器缓存的存储位置 6. 从输入 URL 到页面显示的过程 7. Cache-Control 常见配置值 8. CDN 工作原理 9. 为什么推荐将静态资源放到 CDN 上 10. Cookie 的弊端 11. Cookie 的 Secure 属性设置 12. CORS 请求携带身份凭证的方法 13. CORS 跨域原理 14. 复杂请求预检检查内容 15. CORS 预检请求 16. CORS简单请求的条件 17. 简单请求为何无需预检 18. DNS 域名解析与网络请求路由 19. 什么是跨域 20. 什么是 DNS 劫持? 21. DNS 预解析优化网页加载速度 22. DNS 解析过程与优化 23. URL 参数为什么需要 encodeURIComponent 转码 24. Last-Modified 和 ETag 的区别 25. Fetch 发送两次请求的原因 26. 正向代理与反向代理 27. 前后端通信方式 28. GET请求能否上传图片 29. GET 请求的传参长度限制 30. HTTP 缓存策略 31. GET 与 POST 的区别 32. HTTP状态码301与302的区别 33. HTTP 数据传输 34. HTTP 队头阻塞 35. HTTP 请求头和响应头的重要字段 36. HTTP发展历程 37. HTTP与HTTPS总结 38. HTTP 和 HTTPS 的区别 39. HTTP 报文结构与状态码 40. HTTP Keep-Alive 机制 41. HTTP管道机制的作用 42. HTTP协议优缺点 43. HTTP 重定向状态码 301/302/303/307/308 44. HTTP 请求方法 45. HTTP 协议版本演进 46. HTTP与TCP的区别 47. HTTP/2 多路复用原理 48. HTTPS 协议的缺点 49. HTTP/3 如何保证传输可靠性 50. HTTP/2 的改进 51. HTTPS 加密原理 52. 什么是负载均衡? 53. Nginx 负载均衡调度算法 54. Nginx 是什么 55. 对象存储 OSS 是什么 56. OPTIONS 请求方法及使用场景 57. 轮询与 WebSocket 对比 58. HTTPS 中 SSL 的 OSI 层位置 59. SSL连接恢复 60. 强缓存和协商缓存 61. TCP 三次握手与四次挥手 62. TCP三次握手中的数据传输 63. TCP 和 HTTP 请求的关系 64. TCP/IP 协议 65. TCP 如何判断丢包 66. TCP 与 UDP 的区别 67. WebSocket 的 Handshaking 握手过程 68. TLS 1.3 相比 TLS 1.2 的改进 69. URI、URL、URN 的区别 70. WebSocket 心跳机制 71. WebSocket 协议原理 72. XML与JSON对比

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 等算法,即使私钥泄露,历史通信仍安全