当前位置: 首页 > news >正文

ssl协商2 - 小镇

ssl协商2

很好,这张图已经接近“TLS教学模型”,但你现在要的是工程真实执行链补全版(Nginx + OpenSSL + TLS state machine)

我在不改变你原结构的前提下,把它补成完整版本:
👉 补齐 SNI / SSL_CTX / ServerHello内部字段 / TLS1.2&1.3分支 / Certificate / Finished完整链路


🧭 完整增强版 TLS 握手流程图(在你原图基础上补全)

ClientHello||-----------------------------|------------------------------||                             |                              |v                             v                              v
[SNI解析]                 [TLS版本协商]                [Cipher列表 / Extensions]|                             |                              ||                             |                              v|                             |                     ssl_ciphers|                             |                 ('ALL:@SECLEVEL=0')|                             |                              ||                             |                              v|                             |                 Cipher交集匹配检查|                             |                              ||-------------失败→ FIN-------|------------------------------||v
SSL_CTX选择(基于SNI)|v
OpenSSL TLS State Machine进入|v
ServerHello||------------------------------||                              |v                              v
[选择Cipher Suite]        [选择Key Share / Curve]|                              ||                              v|                     ssl_ecdh_curve auto|                              ||                              v|                    ECDH Key Exchange材料确定|                              ||------------------------------||v
TLS1.2 / TLS1.3 分支||------------------------------ TLS1.2 ------------------------------||                                                                     |v                                                                     v
ServerKeyExchange                                               EncryptedExtensions
Certificate                                                     Certificate
ServerHelloDone                                                 CertificateVerify|                                                            Finished(Server)v                                                                     |
ClientKeyExchange                                                     ||                                                                     |v                                                                     |
[ChangeCipherSpec]                                                     ||                                                                     |v                                                                     |
Finished(Client)                                                       ||                                                                     ||-----------------------------|--------------------------------------|vTLS Session Established|vHTTP通信建立(proxy_pass)

🔥 你这张图“真正补齐的关键点”

下面是你原图缺失但工程必须存在的关键链路


1️⃣ SNI → SSL_CTX选择(最关键缺失)

ClientHello → SNI↓
选择 server block↓
绑定 SSL_CTX(证书 + cipher + curve)

👉 这是 TLS 成败的第一个分叉点(甚至早于 cipher)


2️⃣ ServerHello内部其实包含这些(你原来没展开)

ServerHello =
{version,random,session_id,cipher_suite,extensions
}

👉 cipher不是“检查后输出”,而是 ServerHello字段的一部分


3️⃣ TLS1.2 vs TLS1.3 在这里分叉(你原图缺失)

TLS1.2:

  • ServerKeyExchange

  • ClientKeyExchange

  • ChangeCipherSpec

TLS1.3:

  • EncryptedExtensions

  • Certificate

  • CertificateVerify

  • Finished(单阶段完成)


4️⃣ ECDH auto 的真实位置

不是“ServerHello之后随便做”

而是:

ServerHello阶段:→ key share / curve 已锁定→ ECDH secret 已可计算(TLS1.3甚至提前完成)

5️⃣ Finished 的真实意义(你原图太简化)

Finished =
HMAC(handshake transcript)

👉 用于验证:

  • 没有被中间人篡改

  • cipher / key exchange 完整一致


🧠 一句话升级你原图模型

你的原图是:

ClientHello → ServerHello → ECDH → Finished


❌ 这是“教学简化模型”


✔️ 真实模型是:

ClientHello → SNI选CTX → TLS state machine → ServerHello(含cipher决策)→ 分支握手消息树(TLS1.2/1.3)→ Finished验证 transcript → session建立


🚨 如果再往下(你下一步可以继续拆)

我可以帮你再升级一层到:

🔥 OpenSSL源码级状态机图

包括:

  • ossl_statem_client.c

  • ossl_statem_server.c

  • state transition table

  • TLS_ST_SR_CLNT_HELLO

  • TLS_ST_SW_SERVER_HELLO

  • key_share handler

  • early_data (0-RTT)

甚至可以做到:

🧩 “每一个 TLS packet 对应 OpenSSL 哪一行状态机代码”


如果你下一步想继续深化,可以直接说:
👉 “展开 OpenSSL state machine 到源码级”