IKEv2 密钥交换协议详解:RFC 7296 五大交换流程与国密适配
1. 概述
IKEv2(Internet Key Exchange version 2,RFC 7296)是 IPsec 协议的密钥管理核心组件,由 IETF IPsec 工作组于 2014 年发布为标准(STD: 79)。该标准替代了 RFC 5996,并合并了所有勘误表,标志着 IKEv2 正式成为互联网标准。
IKEv2 设计目标明确:简化 IKEv1 的复杂状态机,增强抗 DoS 能力,原生支持 NAT 穿越,以及提供双向认证机制。作为 IPsec 实现的事实标准,IKEv2 被广泛应用于 Linux strongSwan、Libreswan、Windows Schannel 以及华为、华三等厂商设备中。
┌──────────────────────────────────────────────┐
│ IPsec 协议栈架构 │
├──────────────────────────────────────────────┤
│ │
│ ┌─────────────────────┐ ┌─────────────┐ │
│ │ IKEv2 控制平面 │ │ AH (RFC 4302) │ │
│ │ (密钥管理与协商) │ ├─────────────┤ │
│ │ │ │ ESP (RFC 4303) │ │
│ │ ├─ IKE_SA_INIT │ └─────────────┘ │
│ │ ├─ IKE_AUTH │ │
│ │ ├─ CREATE_CHILD_SA │ │
│ │ ├─ INFORMATIONAL │ │
│ │ └─ DELETE │ │
│ └─────────────────────┘ │
└──────────────────────────────────────────────┘1.1 与 IKEv1 的核心差异
| 特性 | IKEv1(RFC 4306) | IKEv2(RFC 7296) |
|---|---|---|
| 状态机复杂度 | 两套模式(Main Mode/Aggressive Mode) | 单一状态机,四阶段交换 |
| NAT 穿越 | 需 NAT-T 扩展(RFC 3947) | 原生支持 NAT traversal |
| 重保护 | 可选(RFC 4739) | 强制支持 |
| 认证方式 | 预共享密钥/数字证书 | 预共享密钥/公钥/EAP |
| 子 SA 建立 | 通过 Quick Mode | 通过 CREATE_CHILD_SA |
| 错误处理 | 分散在各 Exchange | 统一的 ERR_MSG payload |
2. IKEv2 消息结构
2.1 IKE Header
IKEv2 消息头部固定为 28 字节:
struct ike_header {
uint32_t initiator_spi; // Initiator SPI(8字节)
uint32_t responder_spi; // Responder SPI(8字节)
uint16_t next_payload; // 下一个 payload 类型
uint8_t version; // IKE 版本号(0x20 = IKEv2)
uint8_t exchange_type; // 交换类型
uint32_t message_id; // 消息 ID(防重放)
uint32_t length; // 消息总长度(含 header)
};2.2 Payload 通用格式
每个 Payload 遵循 TLV(Type-Length-Value)结构:
┌──────────┬──────────┬────────────────────────────┐
│ Next Pld │ Flags │ Payload Data │
│ (1B) │ (1B) │ (variable) │
├──────────┼──────────┼────────────────────────────┤
│ 8 bits │ 8 bits │ 以 4 字节对齐的填充 │
└──────────┴──────────┴────────────────────────────┘- Next Payload:指向链中下一个 payload 类型,最后一个 payload 为 0
- Flags:保留位(R)和关键位(K),K=1 表示即使解密失败也必须报告错误
2.3 Exchange 类型编号
| Exchange Type | 数值 | 说明 |
|---|---|---|
| IKE_SA_INIT | 2 | 初始安全关联建立 |
| IKE_AUTH | 3 | 身份认证与首个子 SA |
| CREATE_CHILD_SA | 4 | 派生子安全关联 |
| INFORMATIONAL | 5 | 生命周期管理、错误报告 |
| DELETE | 6 | 删除安全关联 |
3. 核心交换流程详解
3.1 IKE_SA_INIT:初始密钥协商
IKE_SA_INIT 是建立 IKE 安全关联(IKE_SA)的第一步,完成 DH 密钥交换和加密算法协商。此阶段不交换身份信息,仅协商算法参数和生成初始密钥材料。
Initiator Responder
│ │
│─── IKE_SA_INIT ────────────────→│
│ · SPI (Init/Resp) │
│ ·Nonce I │
│ ·Nonce R │
│ ·SA (Proposal) │
│ ·KE (Key Exchange Data) │
│ ·Supported Features │
│ │
│←── IKE_SA_INIT ──────────────────│
│ ·SPI (Init/Resp) │
│ ·Nonce I │
│ ·Nonce R │
│ ·SA (Accepted Proposal) │
│ ·KE (Key Exchange Data) │
│ ·Supported Features │
│ │关键参数:
- SPI:各 8 字节随机值,用于标识 IKE_SA
- Nonce:各自生成的随机数,用于防重放和密钥派生
- SA Payload:包含 Proposal Substructure,协商加密算法、PRF、完整性算法、DH 组
- KE Payload:Diffie-Hellman 公钥值
| Group ID | 描述 | 安全强度 |
|---|---|---|
| 1 | MODP 2048-bit | 112 bits |
| 2 | MODP 1536-bit | 96 bits |
| 5 | MODP 2048-bit (SHA-256) | 112 bits |
| 14 | ECP 256-bit | 128 bits |
| 15 | ECP 384-bit | 192 bits |
| 16 | ECP 521-bit | 256 bits |
| 18 | MODP 4096-bit | 152 bits |
| 19 | MODP 8192-bit | 192+ bits |
3.2 IKE_AUTH:身份认证
IKE_AUTH 在 IKE_SA_INIT 基础上完成双向身份认证,并建立第一个 CHILD_SA(通常用于传输控制消息)。
Initiator Responder
│ │
│─── IKE_AUTH ────────────────────→│
│ ·IDi (Initiator Identity) │
│ ·CERT (Optional Certificate) │
│ ·CERTREQ (Certificate Request) │
│ ·AUTH (Authentication Data) │
│ ·SA (Child SA Proposal) │
│ ·TSi (Traffic Selector Init) │
│ ·TSr (Traffic Selector Resp) │
│ │
│←── IKE_AUTH ─────────────────────│
│ ·IDr (Responder Identity) │
│ ·CERT (Optional Certificate) │
│ ·AUTH (Authentication Data) │
│ ·SA (Accepted Child SA) │
│ ·TSi (Accepted Traffic Sel) │
│ ·TSr (Accepted Traffic Sel) │
│ │认证数据结构:
AUTH payload 格式:
┌──────────┬──────────┬──────────────────────────────┐
│ Next Pld │ Auth Method │ Authentication Data │
│ (1B) │ (1B) │ (variable) │
├──────────┼──────────┼──────────────────────────────┤
│ 预共享密钥 │ 0x01 │ HMAC(prf(SKM, Ni|Nr, KiNa)) │
│ 公钥认证 │ 0x02 │ 数字签名 (initiatorSig) │
│ EAP │ 0x03 │ EAP 响应报文 │
└──────────┴──────────┴──────────────────────────────┘SKM(Shared Key Material)计算:
SKM = prf++(CKOctet, IKM,
Ni | Nr | IDi | IDr |
KeI | KeR | SPIi | SPIr)其中:
CKOctet= 填充至 PRF 输出长度的 0x00IKM= DH 共享密钥(SKM 输入)prf++= 迭代 PRF:prf(SK, data) || prf(SK, data || counter || data)
3.3 CREATE_CHILD_SA:派生子 SA
CREATE_CHILD_SA 用于在已建立的 IKE_SA 上派生新的 CHILD_SA,支持重新密钥(rekey)和新增 SA,无需重建 IKE_SA。
Initiator Responder
│ │
│─── CREATE_CHILD_SA ────────────→│
│ ·SPI (Child SPI) │
│ ·Nonce I │
│ ·SA (Proposal) │
│ ·KE (optional) │
│ ·TSi, TSr │
│ │
│←── CREATE_CHILD_SA ──────────────│
│ ·SPI (Child SPI) │
│ ·Nonce R │
│ ·SA (Accepted) │
│ ·KE (optional) │
│ ·TSi, TSr │
│ │子 SA 重新密钥:使用相同 SPI 建立新 SA,旧 SA 进入延迟删除状态(Delayed Delete)。
3.4 INFORMATIONAL:管理与通知
INFORMATIONAL exchange 用于:
- 发送证书请求(CERTREQ)
- 报告错误(ERR_MSG)
- 请求内部地址分配
- 查询对端版本信息
Initiator Responder
│ │
│─── INFORMATIONAL ──────────────→│
│ ·Notification (optional) │
│ ·Payloads ... │
│ │
│←── INFORMATIONAL ────────────────│
│ ·ACK / Notification │
│ │ │错误消息通过 ERR_MSG payload 传递,包含:
- Protocol ID:出错的协议(1=IKE,2=IPComp)
- Sender SPI:发送方 SPI
- Error Type:错误类型(如 INVALID_KE_PAYLOAD)
- Critical:是否必须处理
3.5 DELETE:安全关联删除
DELETE exchange 用于显式删除 IKE_SA 或 CHILD_SA。
Initiator Responder
│ │
│─── DELETE (SPI, Protocol) ────→│
│ │
│←── DELETE (SPI, Protocol) ──────│
│ │支持对称删除:双方各自独立触发 DELETE,无需等待对方确认。
4. 密钥派生管线
IKEv2 采用分层密钥派生结构(RFC 7296 §2.14):
SK_d (用于签名)
│
SK_d ←── SKpi ←──┤
│ SK_ai (用于完整性)
SK_ai ←── SKpe ←──┤ │
│ │
SK_ar ←── SKer ←──┤ │
│ │
SK_er ←────────────┤ │
│ │
SK_ke ←────────────┤ │
│ │
SK_ar ←────────────┘ │
│ │
SK_d ←─────────────┘ │
│ │
Ni │ Nr ───────────┘ │
│ │
DHH ‖ DHR ← DH 共享密钥 │各密钥用途:
SK_d:签名密钥,用于 AUTH payloadSK_ai/SK_ar:IKE 完整性保护密钥SK_ei/SK_er:IKE 加密密钥SK_ke/SK_kr:CHILD_SA 加密密钥SK_pi/SK_pr:CHILD_SA 完整性密钥
SKpi = prf(SK_d, Ni ‖ Nr ‖ 0x01)
SKpei = prf(SKpi, SK_ei ‖ 0x02)
SKper = prf(SKpi, SK_er ‖ 0x03)
SKpai = prf(SKpi, SK_ai ‖ 0x04)
SKpar = prf(SKpi, SK_ar ‖ 0x05)对于 CHILD_SA:
SKpid = prf(SK_d, Ni ‖ Nr ‖ 0x06)
SKpie = prf(SKpid, SK_ke ‖ 0x07)
SKper = prf(SKpid, SK_kr ‖ 0x08)
SKpia = prf(SKpid, SK_pi ‖ 0x09)
SKpra = prf(SKpid, SK_pr ‖ 0x0A)5. 认证方法详解
5.1 预共享密钥认证(PSK)
预共享密钥是最简单的认证方式,适用于小型网络或测试环境。
认证数据结构:
AUTH Data = HMAC(prf(SK_d, Ni ‖ Nr),
Ni ‖ Nr ‖ SPIi ‖ SPIr ‖ IDi ‖ IDr)局限性:
- 密钥分发困难
- 不支持证书吊销检查
- 不适合大规模部署
5.2 公钥认证(数字证书)
公钥认证使用 X.509 或 SM2 证书进行身份验证。
认证数据结构:
AUTH Data = signature(SK_priv,
Ni ‖ Nr ‖ SPIi ‖ SPIr ‖ IDi ‖ IDr)其中 signature 可以是:
- ECDSA-SHA2-256(椭圆曲线数字签名算法)
- RSA-PSS-SHA256(RSA 填充方案)
- SM2-with-SM3(国密签名算法)
5.3 EAP 认证
扩展认证协议(EAP)支持多种认证方法,包括:
- EAP-TLS:基于证书的 mutual authentication
- EAP-PEAP:受保护的 EAP
- EAP-AKA/AKA':移动网络认证
- EAP-SIM:GSM 认证
6. 国密适配方案
6.1 SM2 在 IKEv2 中的映射
国密算法在 IKEv2 中的适配主要参考 GM/T 0022-2014《IPSec VPN 技术规范》。
加密算法映射:
| 国际标准 | 国密算法 | Transform ID |
|---|---|---|
| AES-128-GCM | SM4-GCM | 12 |
| AES-256-GCM | SM4-GCM | 13 |
| AES-CBC-128 | SM4-CBC | 2 |
| AES-CBC-256 | SM4-CBC | 3 |
| NULL Encryption | 无加密 | 0 |
| 国际标准 | 国密算法 | Transform ID |
|---|---|---|
| HMAC-SHA2-256 | HMAC-SM3 | 3 |
| HMAC-SHA2-384 | HMAC-SM3 | 4 |
| HMAC-SHA2-512 | HMAC-SM3 | 5 |
| 国际标准 | 国密算法 |
|---|---|
| PRF-HMAC-SHA2-256 | PRF-HMAC-SM3 |
| PRF-HMAC-SHA2-384 | PRF-HMAC-SM3 |
| PRF-HMAC-SHA2-512 | PRF-HMAC-SM3 |
6.2 SM2 证书在 IKE_AUTH 中的应用
国密 IKEv2 实现使用 SM2 证书替代 X.509 证书:
# 伪代码:SM2 认证过程
def ike_auth_sm2(initiator_spi, responder_spi, nonce_i, nonce_r,
id_initiator, id_responder):
# 1. 构造认证数据
auth_data_input = nonce_i + nonce_r + initiator_spi + \
responder_spi + id_initiator + id_responder
# 2. SM3 哈希
message_hash = sm3_hash(auth_data_input)
# 3. SM2 签名
signature = sm2_sign(private_key, message_hash)
# 4. 验证对端签名
# ... (双向认证流程)
return signature6.3 国密 DH 组扩展
GM/T 0022-2014 定义了国密 DH 组:
| DH Group | 描述 | 素数位数 |
|---|---|---|
| 19 | SM2 256 位曲线 | 256 |
| 21 | SM2 384 位曲线 | 384 |
7. 安全分析
7.1 抗 DoS 机制
IKEv2 通过以下机制增强抗 DoS 能力:
- Cookie 机制(RFC 7296 §2.6):
- 延迟资源分配:
- 重保护(Replay Protection):
7.2 NAT 穿越
IKEv2 原生支持 NAT 穿越,无需额外扩展:
NAT 检测流程:
1. Initiator 发送 IKE_SA_INIT,检查是否有 NAT 设备
2. 如果检测到 NAT,启用 NAT-keepalive(UDP 4500)
3. 所有 IKE 消息封装在 UDP 4500 端口NAT 穿透通过 UDP 封装实现,避免 AH 协议(ICMP 不可传递)的问题。
7.3 前向保密
IKEv2 支持前向保密(PFS),通过 CREATE_CHILD_SA exchange 中的 KE payload 实现:
if PFS enabled:
new_shared_secret = DH(new_private, peer_public)
rekey_child_sa(new_shared_secret, existing_keys)每重新密钥一次,生成新的 DH 密钥对,确保历史会话密钥不被泄露。
8. 实现参考
8.1 strongSwan 配置示例
# /etc/strongswan.conf
charon {
load = curl nonce randomness nonceblinding sha1 aes cvc der dem dia doh
eap-aka eap-aka-3gpp2 eap-domains eap-expand eap-peap eap-radius
eap-reauth-only eap Sim eap-tls eap-tnc eap-md5 eap-identity
hmac kernel-netlink pem pkcs12 randead rc2 ripemd socket-default
stroke updown x509ac
}
# /etc/strongswan.d/charon/plugins/eap_ms/eap_ms.conf
eap_ms {
msuam = no
}8.2 Linux ipsec.conf 配置
config setup
uniqueids=yes
conn ikev2-sm2
keyexchange=ikev2
ikelifetime=60m
salifetime=24h
type=tunnel
left=%defaultroute
leftcert=myserver.pem
leftid=@company.com
right=%any
rightid=%any
rightauth=pubkey
rightdns=8.8.8.8
proposals=sm2-sm3-sm4!
iketypes=ikev29. 与 TLS 1.3 的对比
| 特性 | IKEv2 | TLS 1.3 |
|---|---|---|
| 握手轮数 | 2 RTT(IKE_SA_INIT + IKE_AUTH) | 1 RTT(0-RTT 可选) |
| 认证方式 | 预共享密钥/证书/EAP | 证书/PSK |
| 密钥派生 | HKDF-like | HKDF |
| 前向保密 | 可选(PFS) | 强制 |
| 重协商 | CREATE_CHILD_SA | 无(需重建连接) |
| 应用场景 | IPsec VPN | Web 应用 |
10. 总结
IKEv2 作为 IPsec 的核心密钥管理协议,通过简化的状态机和增强的安全性设计,成为现代 VPN 实现的首选。其五大交换流程(IKE_SA_INIT、IKE_AUTH、CREATE_CHILD_SA、INFORMATIONAL、DELETE)构成了完整的密钥协商、认证和生命周期管理体系。
国密适配方面,GM/T 0022-2014 定义了 SM2/SM3/SM4 在 IKEv2 中的映射方案,已在华为、华三等厂商设备中广泛部署。随着国密标准的推广,IKEv2 的国密化将成为等保 2.0 和密评合规的必然要求。
相关实践文章
参考文档
- RFC 7296 - Internet Key Exchange Protocol Version 2 (IKEv2), Kaufman et al., October 2014
- GM/T 0022-2014 - IPSec VPN 技术规范
- GM/T 0023-2014 - IPSec VPN 网关产品规范
- NIST SP 800-43 Rev. 2 - Guide to IPsec Version 2