HTTPS

HTTPS(HyperText Transfer Protocol Secure)就是 HTTP 的"安全增强版"。

#type / concept #status / growing #resource / https #tech / network #protocol / https

[!info] related notes

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.2TLS 1.3
握手往返次数2-RTT1-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)

相关笔记

创建于 2026/3/13 更新于 2026/5/27