HTTPS
HTTPS(HyperText Transfer Protocol Secure)就是 HTTP 的"安全增强版"。
#type / concept
#status / growing
#resource / https
#tech / network
#protocol / https
[!info] related notes
- 所属 MOC: http-and-frontend-networking-moc
- 语义总览: http
- TLS 握手: HTTPS/TLS 握手(TLS 1.2 示例)
- TLS 断开: HTTPS/TLS 断开(close_notify)
- 网络 MOC: computer-networking-moc
HTTPS
HTTPS = HTTP + TLS/SSL。HTTPS(HyperText Transfer Protocol Secure)是在 HTTP 下层加入 TLS(Transport Security Layer)加密层,在不改变 HTTP 语义的前提下,提供机密性(防窃听)、完整性(防篡改)和身份认证(防冒充)三大安全保障。
TLS 握手概述(以 TLS 1.2 为例)
客户端 服务器
| |
|--- ClientHello -----------------------------> | ① 支持的 TLS 版本、密码套件列表、随机数 ClientRandom
| |
|<-- ServerHello + Certificate + ServerHelloDone | ② 选定密码套件、随机数 ServerRandom、服务器证书
| |
|--- 验证证书、生成 PreMasterSecret -----------> | ③ 用服务器公钥加密 PreMasterSecret
| (用服务器公钥加密发送) |
| |
| 双方用 ClientRandom + ServerRandom + |
| PreMasterSecret 推导出对称密钥(MasterSecret)|
| |
|--- ChangeCipherSpec + Finished -------------> | ④ 切换到加密通信
|<-- ChangeCipherSpec + Finished -------------- |
| |
=== 后续所有 HTTP 数据通过对称加密传输 ===
握手过程本质上完成了两件事:验证身份(通过证书)和协商密钥(通过非对称加密交换对称密钥)。
证书链
HTTPS 的身份认证依赖 X.509 数字证书,形成信任链:
根证书(Root CA)
↑ 颁发
中间证书(Intermediate CA)
↑ 颁发
服务器证书(Server Certificate)
- 包含域名、公钥、有效期、签名
| 层级 | 说明 | 存储位置 |
|---|---|---|
| 根 CA | 自签名,预装在操作系统/浏览器中 | 受信任根证书存储 |
| 中间 CA | 由根 CA 签发,隔离根 CA 风险 | 服务器在 TLS 握手时发送 |
| 服务器证书 | 绑定域名和公钥 | 服务器在 TLS 握手时发送 |
验证过程:客户端从服务器证书开始,逐级向上验证签名,直到找到受信任的根证书。
TLS 1.2 vs TLS 1.3
| 特性 | TLS 1.2 | TLS 1.3 |
|---|---|---|
| 握手往返次数 | 2-RTT | 1-RTT(甚至 0-RTT) |
| 密钥交换 | RSA / DHE / ECDHE | 仅 ECDHE / DHE(去除 RSA 密钥交换) |
| 密码套件数量 | 大量(含不安全的) | 精简至 5 个 |
| 前向保密 | 可选(需用 DHE/ECDHE) | 强制前向保密 |
| 0-RTT | 不支持 | 支持(有重放风险) |
| 已移除算法 | — | RC4, 3DES, MD5, SHA-1, 静态 RSA 等 |
TLS 1.3 的核心改进:更快(握手更少往返)、更安全(强制前向保密、移除弱算法)、更简洁。
HSTS
HSTS(HTTP Strict Transport Security):服务器通过响应头告诉浏览器”以后只能用 HTTPS 访问我”。
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
| 指令 | 说明 |
|---|---|
max-age | 浏览器记住此策略的秒数(31536000 = 1 年) |
includeSubDomains | 策略适用于所有子域名 |
preload | 申请加入浏览器内置的 HSTS 预加载列表 |
作用:防止首次访问时的 SSL 剥离攻击(中间人将 HTTPS 降级为 HTTP)。
证书固定(Certificate Pinning)
预先在客户端存储服务器证书或公钥的指纹,握手时对比:
- 不依赖 CA 体系,即使 CA 被攻破也能检测
- Chrome 曾对 Google 域名使用,现已移除(维护成本高)
- 移动应用中仍常用(pin 住 API 服务器证书)
- 替代方案:**Certificate Transparency(CT)**日志监控
实用调试命令
# 查看服务器证书信息
openssl s_client -connect example.com:443 -servername example.com
# 查看证书过期时间
echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -dates
# 测试特定 TLS 版本
openssl s_client -connect example.com:443 -tls1_2
openssl s_client -connect example.com:443 -tls1_3
# 查看完整证书链
openssl s_client -connect example.com:443 -showcerts
# 验证证书链
openssl verify -CAfile ca-bundle.crt server.crt
边界与常见误解
- HTTPS 不等于安全:它只保护传输层,应用层漏洞(XSS/SQL 注入)仍然存在
- HTTPS 不一定慢:TLS 1.3 握手只需 1-RTT,且会话恢复可实现 0-RTT
- 自签名证书也能加密:但无法验证身份,浏览器会报警告
- 证书过期后 HTTPS 不会自动降级为 HTTP:浏览器会直接阻止访问(安全策略)
- HTTPS 不隐藏域名:TLS 握手时的 SNI 扩展仍会暴露目标域名(除非使用 ECH/ESNI)
相关笔记
- http — HTTP 语义总览
- https四次握手 — TLS 1.2 握手详细过程
- https挥手 — TLS 断开过程
- HTTP 与前端网络 MOC
- dns — HTTPS 之前的域名解析