HTTPS与TLS握手
概念引入
想象飞翔科技的官网 www.feixiang.net 是一家线上门店。HTTP 相当于"敞开门做生意"——任何人都能站在旁边偷听顾客和店员的对话、篡改订单内容、甚至冒充店员骗钱。
HTTPS(HTTP Secure)就是给这家店装上防弹玻璃和身份识别系统:
- 防窃听:对话加密,旁人听不懂
- 防篡改:数据带"封条",拆开即知
- 防冒充:店员出示"营业执照"(数字证书),顾客可验证真伪
HTTPS = HTTP + TLS(Transport Layer Security,传输层安全协议),默认端口 443。TLS 的前身是 SSL,所以有时也叫 SSL/TLS。
飞翔场景:雁姐(用户运营)处理用户隐私数据,靓晴(UI设计)上传设计稿,都必须走 HTTPS。翼王(架构师)说:"全站 HTTPS 是底线,不是选项。"
核心内容
为什么需要 HTTPS
数字证书:服务器的"营业执照"
数字证书(Digital Certificate)由 CA(Certificate Authority,证书颁发机构)签发,包含:
- 服务器的公钥
- 域名(如
www.feixiang.net) - 有效期
- CA 的数字签名
就像营业执照上有工商局盖章,证书上有 CA 的签名。浏览器内置了可信 CA 的公钥,可以验证签名真伪。
TLS 1.2 握手:四步成交
TLS 1.2 握手需要 2-RTT(2 个往返时延),就像买卖双方四次对话敲定交易:
关键步骤解析:
ClientHello:客户端打招呼,列出支持的 TLS 版本和密码套件(如
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384),发送随机数 A。ServerHello + Certificate:服务器回应,选定 TLS 版本和密码套件,发送随机数 B 和证书。
ClientKeyExchange:客户端验证证书后,用服务器公钥加密一个"预主密钥"(Pre-Master Secret)发送。双方用随机数 A + 随机数 B + 预主密钥,计算出相同的会话密钥(Session Key)。
ChangeCipherSpec:通知对方"后续用会话密钥加密"。Finished 消息是对整个握手过程的摘要,验证握手未被篡改。
密码套件命名:
TLS_密钥交换_身份认证_WITH_对称加密_消息认证
TLS 1.3:更快更安全
TLS 1.3 做了大幅简化:
| 特性 | TLS 1.2 | TLS 1.3 |
|---|---|---|
| 握手 RTT | 2-RTT | 1-RTT(甚至 0-RTT 会话恢复) |
| 密码套件 | 复杂多样 | 仅保留安全的,废弃 RSA 密钥交换、MD5/SHA-1 |
| 加密模式 | 多种 | 仅 AEAD(如 AES-GCM、ChaCha20-Poly1305) |
| 握手明文 | 部分握手数据明文 | 除 ClientHello 外全部加密 |
0-RTT(零往返)会话恢复:如果客户端之前连过该服务器,可以把会话密钥相关信息直接放在第一个包,省去握手延迟。代价是可能受重放攻击,需谨慎启用。
证书验证要点
浏览器连接 HTTPS 网站时,会严格检查证书:
- 信任链:证书必须由内置 CA 签发,或链到可信根证书
- 有效期:证书是否在有效期内(过期会报警)
- 域名匹配:证书里的域名是否等于访问的域名(
www.feixiang.net≠feixiang.net会报警) - 吊销检查:证书是否被 CA 撤销(通过 CRL 或 OCSP 查询)
飞翔场景:凌叔(运维)给官网配证书时,忘了把
feixiang.net和www.feixiang.net都加到 SAN(Subject Alternative Name)里。结果访问不带 www 的域名时,浏览器报"证书与域名不匹配"。
安全增强:HSTS 与证书固定
HSTS(HTTP Strict Transport Security,严格传输安全):服务器告诉浏览器"未来 N 秒内,只准用 HTTPS 访问我,不准 HTTP"。防止用户被劫持到 HTTP 钓鱼页。
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
证书固定(Certificate Pinning):客户端硬编码服务器证书的指纹,只认这一张证。即使 CA 被攻破签发假证,也骗不过客户端。但证书更新时要同步更新客户端,维护成本高。
本篇小结
- HTTPS = HTTP + TLS,默认端口 443,解决 HTTP 的窃听、篡改、冒充三大问题
- 数字证书由 CA 签发,含公钥、域名、有效期,是服务器身份的"营业执照"
- TLS 1.2 握手需要 2-RTT,通过非对称加密交换预主密钥,再生成对称会话密钥
- TLS 1.3 简化为 1-RTT,废弃不安全算法,仅支持 AEAD 加密,更安全高效
- 证书验证需检查:CA 信任链、有效期、域名匹配、吊销状态(CRL/OCSP)
- HSTS 强制浏览器只用 HTTPS 访问,证书固定防止 CA 被攻破后的中间人攻击
- 生产环境务必使用 TLS 1.2+,优先 TLS 1.3,禁用不安全的密码套件
动手实践
温馨提示: 以下实践示例中涉及的域名(如
www.feixiang.net)、公司场景和接口均为虚构数据,仅用于演示协议原理,实际执行时可能不会产生文档中描述的效果。建议将命令中的域名替换为你自己可访问的真实地址进行练习。
实践:用 openssl 查看证书信息
# 查看飞翔官网的证书详情
openssl s_client -connect www.feixiang.net:443 -servername www.feixiang.net </dev/null 2>/dev/null | openssl x509 -text -noout
# 快速查看证书有效期和域名
openssl s_client -connect www.feixiang.net:443 -servername www.feixiang.net 2>/dev/null | openssl x509 -noout -dates -subject -issuer
实践:用 curl 检查 HTTPS 详情
# 查看 TLS 握手过程和证书链
curl -vI https://www.feixiang.net 2>&1 | grep -E "(TLS|SSL|subject|issuer|expire)"
# 指定 TLS 1.3 连接
curl --tlsv1.3 -I https://www.feixiang.net
实践:思考题
- 为什么 TLS 握手先用非对称加密(RSA/ECDHE),握手后却用对称加密(AES)传输数据?对称加密和非对称加密各有什么优缺点?
- 假设某个 CA 机构被黑客攻破,能随意签发
www.feixiang.net的假证书。HSTS 能防御这种攻击吗?证书固定呢? - 凌叔发现官网启用 HTTPS 后,部分老客户端(旧版 Android)无法访问。可能是什么原因?如何在不降低安全性的前提下兼容这些客户端?