CalcGuide · 技术博客主页 / 一页纸学习计划
🟠

TLS 与 HTTPS:从握手到证书信任链

分类:安全与可靠性 · 路径:docs/topics/tls-and-https/README.md

#tls#https#pki#certificate#openssl

理解对称/非对称加密、TLS 1.2/1.3 握手、证书链与 PKI、HSTS、OCSP Stapling,能用 openssl s_client 调试

父主题

计算机网络:从物理层到 HTTP/3 的全栈协议与排查

子主题(0)

TLS 与 HTTPS:从握手到证书信任链

0. 元信息

1. 学习路线

机密性、完整性、身份认证
  → 哈希、MAC、数字签名
  → 对称加密与 AEAD
  → 非对称加密与密钥交换
  → TLS Record 与 CipherSuite
  → TLS 1.2 握手
  → TLS 1.3 握手与 0-RTT
  → X.509 证书与 PKI 信任链
  → HTTPS、SNI、ALPN
  → HSTS、OCSP Stapling、CT
  → OpenSSL 与浏览器排障

每学一个机制,我都问三件事:保护了什么、信任谁、失败时看到什么。

2. 阶段周数分配

阶段4 周方案5 周方案备注
1. 密码学积木0.5 周0.75 周哈希、MAC、签名、AEAD
2. TLS Record 与 CipherSuite0.5 周0.5 周密钥交换、认证、加密套件
3. TLS 1.2 握手0.5 周0.75 周两个 RTT,抓包画时序
4. TLS 1.3 握手0.75 周1 周1-RTT、会话恢复、0-RTT
5. X.509 与 PKI0.75 周1 周SAN、Key Usage、证书链
6. HTTPS 防护0.5 周0.5 周HSTS、OCSP Stapling、CT
7. 综合排障0.5 周0.5 周OpenSSL、curl、testssl.sh

3. 九阶段表

阶段核心知识实践产出可观察学会标准
1. 安全目标机密性、完整性、认证、前向保密一张威胁与机制对照表能说明 TLS 不隐藏 IP 和域名解析
2. 密码学积木AES-GCM、ChaCha20-Poly1305、SHA-256、HMAC、ECDSA用 OpenSSL 算摘要并验签能区分加密、哈希、MAC、签名
3. 密钥交换RSA、(EC)DHE、共享秘密、HKDF画 ECDHE 交换图能解释前向保密为何依赖临时密钥
4. TLS 1.2ClientHello、ServerHello、Certificate、ServerKeyExchange、Finished一份 TLS 1.2 抓包能指出协商 CipherSuite 和证书的位置
5. TLS 1.3key_share、EncryptedExtensions、1-RTT、PSK、0-RTT一份 TLS 1.3 抓包能解释 1.3 删除了哪些旧算法和消息
6. X.509Subject、Issuer、SAN、Validity、Basic Constraints、Key Usage解读一张公网证书能判断域名、有效期、用途是否匹配
7. PKIRoot CA、Intermediate CA、leaf、trust store、路径验证手工整理 example.com 信任链能解释根证书为何常不由服务器发送
8. HTTPS 防护SNI、ALPN、HSTS、OCSP Stapling、CT检查一个站点的响应头和 stapling能分清证书吊销、透明度和强制 HTTPS
9. 排障hostname mismatch、expired、unknown CA、链缺失、协议不兼容一份故障诊断报告能从 verify code 和握手消息给出修复项

4. 第一周任务

任务当天交付
Day 1安装 OpenSSL、curl、Wireshark/tshark、testssl.sh;记录版本工具版本与运行约定
Day 2openssl dgst -sha256openssl rand -hex 32 观察摘要和随机数命令与输出记录
Day 3对比 AES-GCM、ChaCha20-Poly1305、RSA、ECDHE 的职责一张职责表
Day 4运行 openssl s_client -connect example.com:443 -tls1_3 -servername example.com握手输出与协议、CipherSuite 标注
Day 5保存 leaf 证书,运行 openssl x509 -in cert.pem -text -nooutSAN、Issuer、Validity 标注
Day 6curl -Iv https://example.com 检查证书验证、ALPN、响应头一份 HTTPS 连接记录
Day 7项目:检查一个公网 HTTPS 站点,覆盖握手、证书链、HSTS、OCSP Stapling可复现命令 + 输出 + 判断

Day 7 拆解

步骤 A —— 最小可用(60 分钟)

  1. 运行 openssl s_client -connect example.com:443 -tls1_3 -servername example.com -showcerts </dev/null
  2. 记录协议、CipherSuite、证书 Subject/Issuer、Verify return code
  3. curl -sI https://example.com 查看是否有 Strict-Transport-Security
  4. 保存原始输出,不只写结论。

步骤 B —— 补齐四类边界(45 分钟)

5. 阶段通用验收

  1. 不看资料画出 TLS 1.2 和 TLS 1.3 时序图;
  2. 用自己的话区分对称加密、非对称加密、签名和密钥交换;
  3. 从证书文本中找出 SAN、Issuer、Validity、Public Key、Key Usage;
  4. 测试域名不匹配、过期证书、不受信 CA、缺失中间证书四类错误;
  5. 至少检查 3 个站点,保存实际命令和输出;
  6. 能解释 HSTS、OCSP Stapling、CT 各自处理的问题;
  7. 能修改服务端证书链或 TLS 配置,再用客户端验证。

6. 最终验收

7. 综合项目

首选:HTTPS 故障实验室。用 Nginx 或 Caddy 部署本地 HTTPS 服务。自己创建 Root CA、Intermediate CA 和 leaf 证书。让客户端信任测试 Root CA。

备选:公网证书健康检查报告 / TLS 1.2 与 1.3 性能对比 / 内网 mTLS 小实验。

项目必做要求:

  1. 场景说明:域名、网络拓扑、客户端信任库;
  2. 证书生成:Root、Intermediate、leaf 的配置与命令;
  3. 服务配置:完整链、私钥权限、协议和 CipherSuite;
  4. 故障注入:过期、SAN 不匹配、链缺失、unknown CA;
  5. 验证命令:OpenSSL、curl、testssl.sh 各至少一次;
  6. 边界测试:TLS 1.2/1.3、带 SNI/不带 SNI;
  7. README:依赖、运行、清理步骤;
  8. 记录:原始错误、修复动作、修复后证据。

交付物放到项目仓库的 notes/design.mdtest.mdretrospective.md

本主题贡献

本主题沉淀 TLS 1.2/1.3 TLS handshake 消息、X.509 PKI 路径验证、SNI/ALPN/HSTS/OCSP Stapling 工程化,所有结论用 openssl s_client + testssl.sh + Wireshark(配 SSLKEYLOGFILE)三角验证。

职责(3 项)

  1. 画 TLS 1.2 两次 RTT 握手(ClientHello/ServerHello/Certificate/ServerKeyExchange/Finished)与 TLS 1.3 一次 RTT 握手(ClientHello key_share + EncryptedExtensions + Finished),能解释 ECDHE 前向保密为何依赖临时密钥;
  2. openssl x509 -text 中读 Subject/Issuer/SAN/Validity/Key Usage,用 verify -CAfile 构造 leaf → Intermediate → Root 路径,能定位 hostname mismatch、过期、未知 CA、链缺失四类故障;
  3. 配服务端 TLS 1.3 优先 + 完整链 + OCSP Stapling,用 openssl s_client -status 验证 stapled response,用 curl -I 看 HSTS 头,能解释 ALPN 协商 h2 vs http/1.1,以及为什么 Root CA 通常不由服务端发送。

交付物(4 项)

  1. 一份 TLS 1.3 握手 openssl s_client -tls1_3 -servername example.com -showcerts 输出,含协议、CipherSuite、Subject/Issuer、Verify return code 标注;
  2. testssl.sh example.com 扫描报告,列出弱协议/弱算法/证书链告警(关注 SSLv3/TLS1.0/RC4/SHA-1);
  3. 本地 Root CA + Intermediate CA + leaf 自签链 + Nginx/Caddy 配置,能复现 hostname mismatch、过期、未知 CA、链缺失四类故障的客户端错误;
  4. OCSP Stapling 验证记录(openssl s_client -connect ... -status)与 HSTS 响应头检查(Strict-Transport-Security)。

指标(3 项)

  1. TLS 握手 RTT ≤ 1.5 RTT(TLS 1.3 启用后,相对 1.2 减半);
  2. 公网站点 TLS 1.3 启用率 ≥ 90%(testssl.sh 抽样 10 个域名统计);
  3. OCSP Stapling 命中率 ≥ 95%(openssl s_client -status 返回 OCSP Response Status: successful)。

8. 推荐开源资料

角色资料链接用法
协议标准RFC 8446 — TLS 1.3https://www.rfc-editor.org/rfc/rfc8446主线规范
协议标准RFC 5246 — TLS 1.2https://www.rfc-editor.org/rfc/rfc5246对照旧握手
PKI 标准RFC 5280 — X.509 PKIXhttps://www.rfc-editor.org/rfc/rfc5280路径验证与扩展
HTTPS 标准RFC 9110 / RFC 9112https://www.rfc-editor.org/rfc/rfc9110HTTP 语义与 HTTP/1.1
工具手册OpenSSL s_clienthttps://docs.openssl.org/master/man1/openssl-s_client/握手调试
工具手册OpenSSL x509https://docs.openssl.org/master/man1/openssl-x509/证书解析
服务检查testssl.shhttps://github.com/testssl/testssl.sh外部 TLS 配置扫描
浏览器策略MDN HSTShttps://developer.mozilla.org/docs/Web/HTTP/Reference/Headers/Strict-Transport-SecurityHSTS 行为
可视化The Illustrated TLS 1.3 Connectionhttps://tls13.xargs.org/字节级看握手

testssl.sh 使用 GPL-2.0 许可证。OpenSSL 使用 Apache-2.0。复制脚本或代码前要看对应 LICENSE。

9. 学习资料汇聚(v0.3 自包含)

本节由本计划生成。资料按用途筛选。协议行为以 RFC 和实现文档为准。

9.1 背景与动机

HTTP 明文可被链路上的节点读取和修改。早期 SSL 把加密、完整性和服务器身份认证带到 Web。SSL 2.0/3.0 已淘汰。TLS 接替它们,TLS 1.2 曾长期占主流,TLS 1.3 删掉了脆弱算法并缩短握手。

HTTPS 是 HTTP over TLS。它依赖 PKI 把域名绑定到公钥。浏览器和操作系统维护 Root CA 信任库。服务器通常发送 leaf 和 Intermediate CA,客户端据此构造到受信根的路径。

我们学它,是因为证书过期、链缺失、SNI 错配、协议版本冲突都很常见。会看握手和证书链,排障就不靠猜。

9.2 概念地图

flowchart LR
  HTTP --> HTTPS
  HTTPS --> TLS
  TLS --> Record[Record Protocol]
  TLS --> HS[Handshake]
  HS --> KX[ECDHE 密钥交换]
  HS --> Auth[证书签名认证]
  KX --> Secret[共享秘密]
  Secret --> HKDF
  HKDF --> AEAD[AES-GCM / ChaCha20-Poly1305]
  Auth --> Leaf[leaf 证书]
  Leaf --> Intermediate[Intermediate CA]
  Intermediate --> Root[Root CA / trust store]
  Leaf --> SAN[SAN 域名]
  HTTPS --> HSTS
  Auth --> OCSP[OCSP Stapling]
  Auth --> CT[Certificate Transparency]
  HS --> SNI
  HS --> ALPN

TLS Handshake 协商版本、算法和密钥,并认证服务器。Record Protocol 用协商出的密钥保护应用数据。X.509 链回答“这个公钥能否代表该域名”。HSTS、OCSP Stapling、CT 分别约束降级、提供吊销状态、公开证书签发记录。

9.3 基础知识讲解

经典论文 / RFC

资料角色评分链接
RFC 8446 — TLS 1.3当前 TLS 主规范5https://www.rfc-editor.org/rfc/rfc8446
RFC 5246 — TLS 1.2旧版握手与部署基线5https://www.rfc-editor.org/rfc/rfc5246
RFC 5280 — Internet X.509 PKI证书路径验证5https://www.rfc-editor.org/rfc/rfc5280
RFC 6066 — TLS ExtensionsSNI 等扩展4https://www.rfc-editor.org/rfc/rfc6066
RFC 6960 — OCSP在线证书状态4https://www.rfc-editor.org/rfc/rfc6960
RFC 6797 — HSTS强制 HTTPS4https://www.rfc-editor.org/rfc/rfc6797

经典书籍

资料角色评分链接
《Bulletproof TLS and PKI》Ivan RistićTLS 部署和 PKI 排障5https://www.feistyduck.com/books/bulletproof-tls-and-pki/
《Serious Cryptography》Jean-Philippe Aumasson现代密码学工程4https://nostarch.com/seriouscrypto
《Cryptography Engineering》Ferguson、Schneier、Kohno密码系统设计4https://www.schneier.com/books/cryptography-engineering/
《Network Security with OpenSSL》Viega、Messier、ChandraOpenSSL 实践4https://www.oreilly.com/library/view/network-security-with/059600270X/

优秀博客

资料角色评分链接
The Illustrated TLS 1.3 ConnectionTLS 1.3 字节级图解5https://tls13.xargs.org/
Cloudflare Learning Center — TLSWeb 场景短文4https://www.cloudflare.com/learning/ssl/transport-layer-security-tls/
Mozilla SSL Configuration Generator服务端安全配置5https://ssl-config.mozilla.org/
Let’s Encrypt — How It WorksACME 与自动签证书4https://letsencrypt.org/how-it-works/
Scott Helme — HSTSHSTS 实战与风险4https://scotthelme.co.uk/hsts-the-missing-link-in-tls/

核心人物

人物贡献关键出处
Taher Elgamal领导 Netscape SSL 3.0 设计SSL 历史与 ElGamal 签名体系
Eric RescorlaTLS 1.3 主编辑,长期参与 TLS 标准RFC 8446
Tim DierksTLS 1.0 共同编辑RFC 2246
Christopher AllenTLS 1.0 共同编辑RFC 2246
Peter GutmannX.509、PKI 与加密工程研究cryptlib 与 PKI 分析

开发方法

方法适用关键点
从客户端视角复现HTTPS 故障保留域名、端口、SNI、信任库和原始错误
握手逐层排查连接失败DNS → TCP → ClientHello → ServerHello → Certificate → Finished
双版本对比版本或算法冲突分别强制 -tls1_2-tls1_3
证书链逐张检查unknown CA、链缺失看 Subject/Issuer、Basic Constraints、AKI/SKI、有效期
独立工具交叉验证避免单一客户端缓存OpenSSL、curl、浏览器、testssl.sh 互相验证
最小安全配置服务端部署禁用 SSL 与 TLS 1.0/1.1,优先 TLS 1.3,保留必要兼容性

9.4 经典问题与经典案例

#问题为什么重要最简答案
1对称与非对称加密怎么分工非对称运算贵ECDHE 交换秘密,签名认证,AEAD 加密数据
2TLS 1.3 为何更快握手延迟影响首包完整握手通常 1-RTT,恢复可 0-RTT
30-RTT 为什么危险数据可被重放只用于可重放也安全的幂等操作
4证书域名不匹配攻击者可能拿别的合法证书冒充按 SAN 验证目标 hostname,不靠 CN
5服务器为何不发 Root CA客户端必须独立信任根服务端发 root 没法创建信任,只浪费流量
6缺少 Intermediate CA客户端无法构造路径服务端配置 leaf 后接完整中间链
7OCSP Stapling 有什么用客户端直连 CA 暴露访问且慢服务端缓存并附带 CA 签名的状态响应
8HSTS 能否阻止首次降级普通 HSTS 首次访问前未知preload 可覆盖首次访问,但加入前要评估子域
9CT 能否代替证书验证CT 只公开签发记录仍需路径、域名、时间、用途等验证
10SNI 为什么关键一个 IP 托管多个证书ClientHello 携带目标域名,服务端选证书

9.5 学习难点

概念难点

难点为什么会卡突破路径
加密、签名、MAC 混淆都出现密钥和摘要写清谁持有密钥、谁验证、是否提供机密性
CipherSuite 名称变化TLS 1.2 名称含密钥交换和签名,1.3 只描述 AEAD 与 hash把版本和套件拆开读
信任链方向leaf 指向 issuer,验证却从受信锚判断画 leaf → intermediate → root,再标 trust store
主机名与 Subject 混淆老资料强调 CN现代客户端按 SAN 验证

思维难点

难点为什么会卡突破路径
“加密”不等于“可信”自签证书也能加密分开检查通道加密和身份认证
路径构造与路径验证客户端可能从本地缓存补链用空白容器和指定 -CAfile 重测
0-RTT 与 0-RTT 安全更快常被误读成同等安全用重复扣款请求模拟重放风险
吊销的现实行为客户端策略差异大分别检查 OCSP、stapling、浏览器实现

工程难点

难点为什么会卡突破路径
s_client 默认不验证 hostname握手成功被误认为域名可信-verify_hostname example.com 和信任参数
SNI 遗漏多租户站点返回默认证书始终传 -servername
PEM 链顺序错误服务能启动,客户端仍报链错leaf 在前,后接 Intermediate CA,不放 root
私钥与证书不匹配更新证书时拿错 key比较公钥摘要,不比较文件名
容器信任库过旧浏览器正常,容器失败更新 ca-certificates,确认系统时间

9.6 技术标准与接口

9.6.1 Entity

名称版本发布组织状态许可证 / 可访问性
TLS1.3 / RFC 8446IETF TLS WG现行标准免费公开
TLS1.2 / RFC 5246IETF TLS WG广泛兼容,旧版免费公开
PKIX Certificate ProfileRFC 5280IETF LAMPS 前身工作范围现行基础规范免费公开
OCSPRFC 6960IETF PKIX现行标准免费公开
HSTSRFC 6797IETF WebSec现行标准免费公开
Certificate TransparencyRFC 9162IETF TRANSCT v2 标准免费公开
OpenSSL3.xOpenSSL Project活跃实现Apache-2.0

9.6.2 Scope

9.6.3 Structure

TLS 1.3 完整握手关键消息:

ClientHello(key_share, supported_versions, SNI, ALPN)
  → ServerHello(key_share, selected_version)
  → EncryptedExtensions
  → Certificate
  → CertificateVerify
  → Finished
  → Client Finished
  → Application Data

必须掌握的字段和接口:

9.6.4 Ecosystem

9.6.5 Depth Tiers

层级名称必须看到什么
L0知道存在知道 HTTPS 使用 TLS,证书把域名绑定到公钥
L1看得懂示例能读 s_client 的协议、CipherSuite、Subject、Issuer、verify code
L2能正确调用能检查握手、解析证书、验证 hostname 和信任链
L3能解释与排错能定位版本、SNI、证书链、有效期、信任库、OCSP Stapling 问题
L4能设计与扩展能设计私有 PKI、证书轮换、mTLS 和 TLS 策略,并评估兼容与吊销方案

本计划要求达到:L3。做平台安全或 PKI 服务时再进入 L4。

9.6.6 Source

10. 常见误区

11. 所有知识点分类(统一规则)

  1. 编程语言
  2. 数据结构与算法
  3. 计算机基础:网络协议、密码学基础、PKI
  4. 工程技术:证书部署、服务配置、调试工具
  5. Web 与后端:HTTPS、反向代理、浏览器安全策略
  6. 前端与客户端
  7. 数据与人工智能
  8. 项目与职业能力
  9. 安全与可靠性:TLS、证书信任、加密策略、吊销机制

本计划归属:安全与可靠性 主 + 计算机基础 辅。


直接依赖(1)

查看知识图谱