握手篇 停在「四条消息之后 IKE SA 与首个 Child SA 参数已定」。本篇回答三个更硬的问题:密钥字节从哪来、Child SA 与 IKE SA 如何分工、rekey 时哪些对象被替换。通识层面的 Extract-Expand 见站内 KDF 篇;这里只钉 RFC 7296 的 IKEv2 用法。
一、SKEYSEED 与 prf+
IKE_SA_INIT 结束后,双方共享:
- DH 共享秘密 \(g^{ir}\)(记法随实现;规范称 Diffie-Hellman shared secret)
- Nonce \(Ni\)、\(Nr\)
- 选定的 PRF 算法
RFC 7296 §2.14:
\[ \mathrm{SKEYSEED} = \mathrm{prf}(Ni \mathbin{|}| Nr,\ g^{ir}) \]
(当使用非空的 PPK 等扩展时公式会变;本篇以核心文档为准。)
随后用 prf+(基于 PRF 的密钥扩展,生成足够长的密钥流)派生:
\[ \begin{aligned} &\{SK_d \mathbin{|}| SK_{ai} \mathbin{|}| SK_{ar} \mathbin{|}| SK_{ei} \mathbin{|}| SK_{er} \mathbin{|}| SK_{pi} \mathbin{|}| SK_{pr}\} \\ &\quad = \mathrm{prf+}(\mathrm{SKEYSEED},\ Ni \mathbin{|}| Nr \mathbin{|}| SPIi \mathbin{|}| SPIr) \end{aligned} \]
| 密钥 | 用途 |
|---|---|
| \(SK_d\) | 派生后续 Child SA 密钥的种子 |
| \(SK_{ai}/SK_{ar}\) | IKE 消息完整性(分方向) |
| \(SK_{ei}/SK_{er}\) | IKE 消息加密(分方向) |
| \(SK_{pi}/SK_{pr}\) | 生成 AUTH 载荷时使用的材料(与认证方法相关) |
AEAD 套件下「加密与完整性」合并,但密钥树仍按规范展开对应长度的密钥字段。站内 KDF 篇已指出:IKEv2 的 prf+ 与后来 HKDF 的 Extract-then-Expand 同族,但是独立规范,实现必须跟 RFC 7296 而非「凭感觉套 HKDF」。
二、首个 Child SA 的密钥
IKE_AUTH 中协商的 Child SA 密钥(ESP/AH)由 \(SK_d\)、Nonces 以及(若该 Child 再次做了 KE)额外 DH 共享秘密派生,见 RFC 7296 §2.17。直觉:
- 没有额外 KE:Child 密钥绑在 IKE SA 的 DH 与 Nonce 上;IKE SA 泄露会危及这些 Child(前向保密粒度取决于是否为 Child 单独做 DH)。
- 有额外 KE(CREATE_CHILD_SA 或初始交换中的可选 KE):Child 获得独立 DH 贡献,提升对该 Child 的 PFS。
工程默认:站点隧道常在 CREATE_CHILD_SA / rekey 时带
KE,以换 Child 级 PFS;具体 proposal 由管理员写进
esp_proposals(strongSwan)或对等配置。
三、流量选择器(TS)
TSi / TSr 描述 Child SA 允许保护的流量:地址范围、协议、端口范围等(RFC 7296 §3.13)。它们是策略在 IKE 语言中的投影,最终应落到 SPD/policy:
- 发起方提出自己的 TSi 与对端的 TSr。
- 响应方可缩小选择器(narrowing),但不能任意扩大到发起方未提议的范围(规范约束 + 实现策略)。
- 收窄失败或两端理解不一致 → 典型故障:「IKE ESTABLISHED,业务子网不通」。
与 WireGuard AllowedIPs 对比:TS 更细(可到端口),且与身份(ID/证书)是分开的对象;AllowedIPs 直接绑在 peer 公钥上。
四、CREATE_CHILD_SA 与 rekey
初始握手之后,任一方可发起 CREATE_CHILD_SA(交换类型 36)以:
- 建立额外 Child SA(多选择器、多算法需求)。
- Rekey 现有 IKE SA 或 Child SA(带
REKEY_SANotify 指向旧 SA)。
Rekey 的工程要点:
- 软生命周期到期开始协商新 SA;硬生命周期到期删除旧 SA。重叠窗口内新旧 SA 可短暂并存,避免黑洞。
- IKE SA rekey 与 Child SA rekey 是不同对象;只 renew Child 时 IKE 控制通道密钥可变可不变,取决于是否同时 rekey IKE。
- 消息仍在现有 IKE SA 的 \(SK_e/SK_a\) 保护下;新 Child 密钥按 §2.17 用 \(SK_d\) 与新 Nonce(及可选新 DH)计算。
Linux 上 rekey 成功后,ip xfrm state
应出现新 SPI,旧 SPI
在硬超时后消失;若用户态以为成功而内核仍只有旧 state,属于
第 6–7 篇
的脱节故障。
五、与数据面的接缝
flowchart TD
ike["IKEv2 daemon"] -->|"install"| policy["xfrm policy ~ SPD"]
ike -->|"install"| state["xfrm state ~ SAD"]
state -->|"SPI + keys"| esp["ESP transform"]
policy -->|"selector match"| state
密钥树停在用户态推导完成之后,必须安装进内核(或用户态数据路径)。本系列主线是内核 xfrm:Child SA 的 SPI、算法、密钥、模式、外层隧道端点写入 state;TS 写入 policy。缺一步都会出现「swanctl 显示 INSTALLED 但抓包仍是明文」或相反。
六、本文边界
- 不推导全部 AEAD 套件的密钥长度表(以 IANA / RFC 与实现为准)。
- 不覆盖 RFC 9370 多密钥交换对 SKEYSEED 的修改细节——深度篇 讨论 PQ 框架时再钉。
- 不做「某 proposal 字符串一定最快」的性能断言。
下一篇进入数据面:ESP、AH 与 NAT-T。
参考资料
规范
- RFC 7296 §2.13–2.18、§3.13(TS)。
站内
同主题继续阅读
把当前热点继续串成多页阅读,而不是停在单篇消费。
【IPSec】深度探讨:形式化证明、密码敏捷性与后量子
用 Cremers ESORICS 2011 的 IKEv2 形式化结论、RFC 9370 混合密钥交换与 Gazdag 等对 PQ 扩展的 Tamarin 分析,对照 WireGuard 的无协商立场,收束何时仍应选择 IPsec。
【WireGuard】深度探讨:形式化证明、密码敏捷性与后量子
Dowling–Paterson 对 1.5 RTT confirmation 的证明障碍、Donenfeld 的回应、netdev 上「无算法协商」争论、PSK 量子权宜之计,以及 WireGuard 作为 ZTNA 数据面的边界与开放问题。
【IPSec】IKEv2 握手:IKE_SA_INIT 与 IKE_AUTH
RFC 7296 用两个交换、四条消息建立 IKE SA 并捎带首个 Child SA。本文按载荷语义拆开 IKE_SA_INIT / IKE_AUTH,说明 PSK 与证书 AUTH、Cookie 抗 DoS 边界,以及和 WireGuard 1.5 RTT 确认的差异。
【IPSec】strongSwan:从 swanctl 到内核 SA
拆解 strongSwan 的 charon、VICI/swanctl 与 kernel-netlink:配置里的 connections/children/proposals 如何变成 Linux xfrm 的 policy 与 state,并与 VPN 对比文中的站点示例对齐。