【IPSec】密钥派生与 Child SA

💡 原文中文,约3600字,阅读约需9分钟。
📝

内容提要

本文介绍IKEv2密钥管理:SKEYSEED由DH共享秘密和Nonce经PRF生成,再用prf+派生SK_d等密钥;Child SA密钥由SK_d派生,可额外DH提升PFS;TSi/TSr定义流量选择器;CREATE_CHILD_SA用于建新SA或rekey,新旧SA短暂并存;密钥需安装至内核xfrm,否则抓包仍为明文。

🔎

延伸解读

密钥派生与PFS的权衡

IKEv2的密钥派生分为两层:SKEYSEED由DH共享秘密和Nonce生成,再通过prf+派生SK_d等密钥;Child SA密钥则由SK_d派生。若Child SA不额外进行DH交换,其密钥与IKE SA绑定,IKE SA泄露会危及Child SA;若在CREATE_CHILD_SA或初始交换中携带KE,则Child SA获得独立DH贡献,提升前向保密性。站点隧道常选择在rekey时带KE以换取Child级PFS,但需在配置中明确指定。

流量选择器与策略落地

TSi/TSr描述Child SA允许保护的流量,包括地址、协议、端口等,是策略在IKE语言中的投影。响应方可以收窄选择器,但不能任意扩大。若收窄失败或两端理解不一致,会导致“IKE ESTABLISHED,业务子网不通”的典型故障。与WireGuard的AllowedIPs相比,TS更细粒度(可到端口),且与身份分离,最终需映射到内核SPD/policy。

Rekey的工程要点

CREATE_CHILD_SA用于建立新Child SA或rekey现有SA。软生命周期到期开始协商新SA,硬生命周期到期删除旧SA,重叠窗口内新旧SA并存以避免黑洞。IKE SA rekey与Child SA rekey是不同对象,只renew Child时IKE控制通道密钥可变可不变。rekey消息仍在现有IKE SA保护下,新Child密钥由SK_d和新Nonce(及可选新DH)计算。Linux上rekey成功后,ip xfrm state应出现新SPI,旧SPI在硬超时后消失。

Q&A

IKEv2中SKEYSEED是如何生成的?

SKEYSEED由PRF函数以Nonce Ni和Nr的拼接作为密钥,对DH共享秘密g^ir进行运算生成,即SKEYSEED = prf(Ni | Nr, g^ir)。

prf+函数在IKEv2中用于什么?它和HKDF有什么关系?

prf+用于从SKEYSEED派生后续所需的密钥材料,如SK_d、SK_ai等。它和HKDF的Extract-then-Expand同族,但prf+是IKEv2的独立规范,实现必须遵循RFC 7296,不能直接套用HKDF。

Child SA的密钥是如何从SK_d派生的?额外DH交换如何影响PFS?

Child SA的密钥由SK_d、Nonces以及可选的额外DH共享秘密派生。如果没有额外KE,Child密钥绑定在IKE SA的DH和Nonce上,IKE SA泄露会危及这些Child;如果有额外KE,Child获得独立DH贡献,提升对该Child的前向保密性(PFS)。

TSi和TSr在IKEv2中起什么作用?与WireGuard的AllowedIPs有何不同?

TSi和TSr描述Child SA允许保护的流量,包括地址范围、协议、端口等,是策略在IKE语言中的投影。与WireGuard的AllowedIPs相比,TS更细(可到端口),且与身份是分开的对象,而AllowedIPs直接绑在peer公钥上。

CREATE_CHILD_SA交换的主要用途是什么?rekey时新旧SA如何过渡?

CREATE_CHILD_SA用于建立额外Child SA或对现有IKE SA/Child SA进行rekey。Rekey时,软生命周期到期开始协商新SA,硬生命周期到期删除旧SA,重叠窗口内新旧SA可短暂并存,避免黑洞。

为什么密钥必须安装到内核xfrm?如果未安装会出现什么现象?

密钥树在用户态推导完成后,必须安装进内核(或用户态数据路径),因为数据面(如ESP)需要内核中的SPI、密钥等参数来加解密。如果未安装,会出现swanctl显示INSTALLED但抓包仍是明文的现象。

🏷️

标签

➡️

继续阅读