什么是 HTTPS
HTTPS(HyperText Transfer Protocol Secure)是 HTTP 的安全版本,通过在 HTTP 和 TCP 之间集成 SSL/TLS 协议(Secure Sockets Layer / Transport Layer Security),实现数据的加密传输、身份验证和完整性保护。它确保客户端(如浏览器)与服务器之间的通信安全,防止窃听、篡改和伪造。
核心原理
HTTPS 使用混合加密机制: - 握手阶段:通过非对称加密协商会话密钥。 - 传输阶段:用对称加密保护数据。
1. HTTPS 详解
作用
- 机密性:数据加密,防止窃听。
- 完整性:校验数据未被篡改(如 HMAC)。
- 认证:验证服务器身份,防止中间人攻击。
与 HTTP 对比
- HTTP:明文传输,无安全保障。
- HTTPS:加密传输,带身份验证。
核心组件
- SSL/TLS:加密协议,提供安全通道。
- 证书:由 CA(证书颁发机构)签发,含服务器公钥。
- 加密算法:
- 对称:AES(如 AES-256-GCM)。
- 非对称:RSA、ECDHE(椭圆曲线 Diffie-Hellman)。
2. HTTPS 工作流程(TLS 握手)
以 TLS 1.2 为例(TLS 1.3 稍有优化):
(1) Client Hello
- 客户端发送:
- TLS 版本(如 1.2 或 1.3)。
- 支持的加密套件(如
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
)。 - 随机数(Client Random,用于密钥生成)。
- 目的:发起协商,告知能力。
(2) Server Hello
- 服务器回复:
- 选定 TLS 版本和加密套件。
- 随机数(Server Random)。
- 数字证书(含公钥和 CA 签名)。
- 目的:确定参数,提供身份证明。
(3) 证书验证
- 客户端操作:
- 检查证书是否由受信任 CA 签发。
- 验证域名匹配、证书未过期。
- 结果:确认服务器可信。
(4) 密钥协商
- 客户端:
- 生成 Pre-Master Secret,用服务器公钥加密发送(RSA)。
- 或用 ECDHE 交换临时密钥。
- 双方:
- 用 Client Random、Server Random、Pre-Master Secret 通过伪随机函数(PRF)生成对称会话密钥。
- 特点:
- ECDHE 提供前向安全性(密钥泄露不影响历史数据)。
(5) 握手完成
- 双方发送 Finished:
- 用会话密钥加密握手消息校验码,互相验证。
- 结果:安全连接建立。
(6) 数据传输
- 对称加密:
- 用会话密钥(如 AES)加密 HTTP 数据。
- 添加 HMAC(基于 SHA256)校验完整性。
图示
客户端 服务器
| Client Hello |
|--------------->|
| Server Hello |
| Certificate |
|<---------------|
| 验证证书 |
| Key Exchange |
|--------------->|
| Finished |
|<-------------->|
| 加密传输 |
|<-------------->|
3. 加密原理
混合加密
- 非对称加密:
- 作用:握手交换密钥。
- 算法:
- RSA:公钥加密 Pre-Master Secret。
- ECDHE:双方生成临时密钥对,计算共享密钥。
- 特点:慢,适合小数据。
- 对称加密:
- 作用:传输数据。
- 算法:AES(CBC 或 GCM 模式)。
- 特点:快,适合大流量。
完整性
- HMAC:用哈希算法(如 SHA256)生成校验码,确保数据未改。
TLS 1.3 改进
- 简化握手:1-RTT(一次往返),更快。
- 强制前向安全:禁用 RSA 密钥交换,仅用 ECDHE。
- 加密更强:握手消息部分加密。
4. HTTPS 的优点与缺点
优点
- 安全性高,防窃听、伪造。
- 用户信任(浏览器显示锁图标)。
- SEO 提升(Google 偏好 HTTPS)。
缺点
- 握手延迟(TLS 开销)。
- 证书管理复杂(需申请、续期)。
5. 延伸与面试角度
- 安全威胁:
- 中间人攻击:无证书验证可伪造。
- 解决:CA 签名、HSTS(强制 HTTPS)。
- 性能优化:
- 会话复用:Session ID 或 Ticket 减少握手。
- OCSP Stapling:加速证书状态检查。
- 实际应用:
- 网站:如
https://www.google.com
。 - API:如支付接口。
- 面试点:
- 问“流程”时,提 6 步握手。
- 问“加密”时,提混合加密和 ECDHE。
示例(Java 调用 HTTPS)
URL url = new URL("https://api.example.com");
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.connect(); // 触发 TLS 握手
InputStream in = conn.getInputStream();
总结
HTTPS 通过 SSL/TLS 提供安全通信,握手用非对称加密协商密钥,传输用对称加密保护数据。TLS 1.2 有完整流程,1.3 更高效。面试时,可画握手图或提前向安全,展示理解深度。