Appearance
HTTPS 与 TLS/SSL
问题
HTTPS 和 HTTP 有什么区别?TLS/SSL 的工作原理是什么?数字证书是做什么用的?HTTPS 的握手过程是什么?
结论
HTTPS vs HTTP
| HTTP | HTTPS | |
|---|---|---|
| 传输 | 明文,可被窃听/篡改 | SSL/TLS 加密,防窃听、篡改、身份伪装 |
| 端口 | 80 | 443 |
| 证书 | 不需要 | 需要 CA 颁发的 SSL 证书 |
| 性能 | 无加解密开销 | 握手阶段有额外延迟,通信有加解密开销 |
| 身份验证 | 无 | 验证服务器身份(数字证书) |
HTTP 的安全风险:
- 信息窃听(中间人可读取明文)
- 信息篡改(中间人可修改报文)
- 身份劫持(无法验证服务器真实身份)
TLS/SSL 工作原理
TLS/SSL 的功能基于三类算法协同实现:
① 散列函数(Hash)
常见算法:MD5、SHA1、SHA256。单向不可逆,用于验证数据完整性(防篡改)。
② 对称加密
双方共享同一密钥加解密。常见算法:AES-CBC、AES-GCM、DES。
- 优点:速度快(加解密性能好)
- 缺点:密钥如何安全传输是问题
③ 非对称加密
公钥加密,私钥解密(反之也可)。常见算法:RSA、ECC。
- 优点:无需共享私钥,可安全传输公钥
- 缺点:加密速度慢
TLS 实际方式:用非对称加密协商出对称密钥,再用对称加密进行通信——兼顾安全与性能。
数字证书与 CA
问题:非对称加密仍然有中间人风险——中间人可以替换公钥,伪装成服务器与客户端通信。
解决方案:数字证书 + CA(证书颁发机构)。
CA 用自己的私钥对服务器公钥+信息摘要进行签名,生成数字证书。客户端收到证书时:
- 用 CA 的公钥(预置在浏览器/OS 中)解密签名,得到 CA 生成的摘要
- 对证书原始信息再次 Hash,生成自己的摘要
- 两个摘要一致 → 证书未被篡改 → 服务器公钥可信
HTTPS 握手过程
以 TLS 1.2 为例(简化为 5 步):
- 客户端 Hello:发送支持的 TLS 版本、加密算法列表、随机数 ①
- 服务端 Hello:确认 TLS 版本和加密算法、发送数字证书、随机数 ②
- 客户端验证证书:验证证书有效性;生成随机数 ③,用证书中的公钥加密后发给服务端;附上前面内容的 Hash 值
- 服务端解密:用私钥解密得到随机数 ③;发送前面内容的 Hash 值供客户端校验
- 双方生成会话密钥:用三个随机数 ①②③ 按约定算法生成对称密钥,后续通信用该密钥加密
HTTPS 如何保证安全
对称密钥协商安全 → 依赖非对称加密(公钥加密传输)
服务器身份可信 → 依赖 CA 数字证书 + 数字签名
密钥不被窃取 → 私钥始终在服务器,公钥公开
数据不被篡改 → Hash 摘要 + 加密通信HTTPS 的优缺点
优点:
- 通信加密,防窃听和 MITM 攻击
- 验证服务器身份,防钓鱼/劫持
- 现代 SEO 加分,Chrome 对非 HTTPS 标记"不安全"
缺点:
- 证书需要购买(Let's Encrypt 提供免费证书)
- 握手阶段有额外 RTT(TLS 1.3 已降为 1-RTT,甚至 0-RTT)
- 加解密有 CPU 开销(现代硬件已可忽略)