一句话总结
HTTP 是明文传输,HTTPS = HTTP + SSL/TLS,通过加密保证安全。核心区别:端口(80 vs 443)、加密(无 vs SSL/TLS)、证书(不需要 vs 需要 CA 证书)。HTTPS 握手过程:Client Hello → Server Hello + 证书 → 密钥交换 → 对称加密通信。混合加密:非对称加密(RSA/ECDHE)交换密钥,对称加密(AES)传输数据。HTTP/2 核心改进:多路复用、头部压缩、服务器推送、二进制分帧。
初级理解
HTTP vs HTTPS 对比
| 对比维度 | HTTP | HTTPS |
|---|---|---|
| 端口 | 80 | 443 |
| 安全性 | 明文传输,易被窃听篡改 | SSL/TLS 加密,安全 |
| 证书 | 不需要 | 需要 CA 颁发的证书 |
| 连接 | 简单,TCP 三次握手后通信 | TCP 握手后还需 SSL/TLS 握手 |
| SEO | Google 降低排名 | Google 优先收录 |
| 速度 | 快(无加密开销) | 略慢(加密解密 + 握手) |
HTTPS 加密原理
# HTTPS 使用混合加密:
# 1. 非对称加密(公钥+私钥):用于握手阶段交换"会话密钥"
# 2. 对称加密(同一个密钥):用于数据传输
# 为什么混合?
# 非对称加密:安全但慢(RSA 2048位)
# 对称加密:快但需要安全交换密钥(AES 256位)
# 结合:用非对称加密安全交换对称密钥,用对称加密高效传输数据
# 简化流程:
# 1. 客户端 → 服务端:Client Hello(支持的加密套件)
# 2. 服务端 → 客户端:Server Hello + 证书(含公钥)
# 3. 客户端验证证书 → 生成随机密钥 → 用公钥加密 → 发给服务端
# 4. 服务端用私钥解密 → 得到对称密钥
# 5. 双方用对称密钥加密通信
中级深入
SSL/TLS 握手详细过程
# TLS 1.2 握手(RSA 密钥交换):
# 1. Client Hello
# 客户端 → 服务端:支持的 TLS 版本、加密套件、随机数1
# 2. Server Hello
# 服务端 → 客户端:选定的 TLS 版本、加密套件、随机数2
# 3. Certificate
# 服务端 → 客户端:证书(含公钥)
# 4. Server Hello Done
# 服务端 → 客户端:握手消息结束
# 5. Client Key Exchange
# 客户端:生成随机数3(Pre-Master Secret)
# → 用证书公钥加密 → 发给服务端
# → 双方用随机数1+2+3生成会话密钥(Master Secret)
# 6. Change Cipher Spec
# 客户端 → 服务端:通知后续用会话密钥加密
# 7. Finished(加密)
# 客户端 → 服务端:握手完成验证
# 8. Change Cipher Spec + Finished
# 服务端 → 客户端:同样通知并验证
# TLS 1.3 改进(更快更安全):
# 1. 握手减为 1-RTT(TLS 1.2 需要 2-RTT)
# 2. 移除不安全算法(RSA 密钥交换、CBC 模式)
# 3. 只支持前向安全的 ECDHE 密钥交换
# 4. 0-RTT 模式(重连时更快)
数字证书与 CA
# 证书的作用:证明"公钥确实属于这个网站"
# 证书内容:
# 1. 网站域名
# 2. 网站公钥
# 3. 证书有效期
# 4. 颁发机构(CA)信息
# 5. CA 的数字签名
# 验证链(证书链):
# 网站证书 → 中间 CA 证书 → 根 CA 证书(浏览器内置)
# 逐级验证签名,直到根证书
# 中间人攻击(MITM):
# 攻击者在客户端和服务端之间拦截通信
# HTTPS 通过证书验证防止 MITM:
# 攻击者无法伪造 CA 签名的证书
# 浏览器会提示"证书不受信任"
高级进阶
HTTP/1.1 vs HTTP/2 vs HTTP/3
| 特性 | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|
| 传输层 | TCP | TCP | QUIC(UDP) |
| 多路复用 | 不支持(队头阻塞) | 支持(流复用) | 支持(无队头阻塞) |
| 头部压缩 | 不支持 | HPACK | QPACK |
| 服务器推送 | 不支持 | 支持 | 支持 |
| 连接建立 | TCP 1-RTT + TLS 1-RTT | TCP 1-RTT + TLS 1-RTT | 0-RTT(重连) |
HTTPS 性能优化
# 1. Session 复用(Session ID / Session Ticket)
# 首次握手后缓存会话密钥,下次连接跳过密钥交换
# 减少 1-RTT
# 2. OCSP Stapling(证书状态在线查询)
# 服务端预先获取 OCSP 响应,握手时一起发给客户端
# 客户端无需单独查询 CA,减少延迟
# 3. False Start(抢先开始)
# 客户端在收到 Finished 之前就开始发送应用数据
# 减少 1-RTT
# 4. HSTS(HTTP Strict Transport Security)
# 强制浏览器使用 HTTPS,避免 301 重定向
# Strict-Transport-Security: max-age=31536000
# 5. TLS 1.3(更快握手)
# 1-RTT 握手(TLS 1.2 需要 2-RTT)
# 0-RTT 重连(PSK 模式)
# 6. ECDHE 密钥交换(前向安全)
# 每次会话生成新密钥,即使私钥泄露也不影响历史会话
实战场景
# 场景1:Nginx 配置 HTTPS
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# 只使用安全的加密套件
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:...;
ssl_protocols TLSv1.2 TLSv1.3;
# 启用 HSTS
add_header Strict-Transport-Security
"max-age=63072000" always;
}
# 场景2:HTTP 强制跳转 HTTPS
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
# 场景3:查看网站证书信息
openssl s_client -connect example.com:443 -servername example.com
面试模拟
面试官:HTTP 和 HTTPS 的区别?HTTPS 如何保证安全?
你:HTTP 明文传输,HTTPS 通过 SSL/TLS 加密。HTTPS 安全机制:1)混合加密(非对称加密交换密钥,对称加密传输数据);2)数字证书验证身份(防止中间人攻击);3)消息认证码(MAC)保证数据完整性。端口 80 vs 443。
面试官:HTTP/2 相比 HTTP/1.1 有哪些改进?
你:四大改进:1)多路复用(一个 TCP 连接并发多个请求,解决队头阻塞);2)头部压缩(HPACK 算法,减少重复头部传输);3)服务器推送(主动推送资源,如 CSS/JS);4)二进制分帧(二进制格式替代文本,解析更高效)。