GM/T 0022-2023 IPSec VPN 国密改造实战:从协议原理到工程部署

国密算法 · 2026-08-17 · 78 阅读

前言:为什么要做 IPSec VPN 的国密改造?

IPSec VPN 是企业广域网互联的核心基础设施,广泛应用于分支机构互联、移动办公、云上专线等场景。传统的国内容 IPsec 实现主要依赖国际算法(AES-128/256、SHA-1/256、RSA),在等保 2.0 和密评要求下,必须完成 SM2/SM3/SM4 国密算法的适配。

GM/T 0022-2023《IPSec VPN 技术规范》于 2023 年发布,替代了原 2014 年版标准,核心变化包括:

  • 算法套件强制化:要求支持 SM2-SM3-SM4 组合,禁用 RSA-SHA1 等弱算法
  • 双证书机制:引入签名证书与加密证书分离,提升密钥管理灵活性
  • IPv6 原生支持:扩展 NAT-T 对 IPv6 环境的适配
本文不讨论协议原理(详见 IPSec VPN 国密协议详解),而是聚焦工程落地——如何选型、配置、调试,以及避坑指南。

环境准备:国密 IPSec 的技术栈选型

内核方案对比

国密 IPSec 在国内主要有三条技术路线:

方案内核支持适用场景维护状态
StrongSwan + GCert 插件Linux 5.15+企业网关、分支互联活跃维护
Libreswan + SM 扩展Linux 5.15+传统 L2TP 迁移社区版本有限
Tongsuo (原 BoringSSL fork)全版本高性能场景、云厂商阿里主导,持续迭代
推荐方案:Linux 5.15+ 内核配合 StrongSwan 7.x + GCert 国密插件,或基于 Tongsuo 内核的 IPSec 实现(如某些云厂商提供的国密 IPSec 服务)。

依赖包验证

BASH
# 验证 StrongSwan 国密插件可用性
swanctl --version
# 预期输出:strongSwan Uptime xxx

# 验证国密算法模块加载
ipsec statusall
# 应看到 sm2、sm3、sm4 相关的算法套件列表

# 验证内核支持
grep -i 'sm2\|sm3\|sm4' /proc/crypto
# 应有 SM2/SM3/SM4 相关条目

如果内核缺少国密算法支持,需要确认内核配置:

BASH
# 检查内核是否编译了国密算法
zcat /proc/config.gz | grep -E 'CRYPTO_SM2|CRYPTO_SM3|CRYPTO_SM4'

如果显示 =m(模块)或 =y(内置),则支持。如果显示 # CONFIG_CRYPTO_SMx is not set,需要重新编译内核或加载相应模块。

算法套件选择:SM2-SM3-SM4 组合的四种模式

GM/T 0022-2023 定义了国密 IPSec 的四种核心算法组合:

模式一:SM2 签名 + SM3 杂凑 + SM4-CBC 加密(基础模式)

YAML
proposal: sm2_sm3_sm4-cbc-128

适用场景:传统网络环境,对性能要求不高,需兼容老版本设备。

性能特征:SM4-CBC 模式需要额外填充处理,吞吐量约为 SM4-GCM 的 60-70%。

模式二:SM2 签名 + SM3 杂凑 + SM4-GCM 认证加密(推荐模式)

YAML
proposal: sm2_sm3_sm4-gcm-128

适用场景:现代网络环境,需要认证加密(AEAD)能力。

优势:GCM 模式将加密和完整性校验合并为一次运算,性能优于 CBC + HMAC-SM3 组合。实测吞吐性能提升约 30-40%。

模式三:SM2 签名 + SM3 杂凑 + SM4-CCM 认证加密

YAML
proposal: sm2_sm3_sm4-ccm-128

适用场景:对消息认证强度有特殊要求的场景。

模式四:SM2 签名 + SM3 杂凑 + SM4-XTS 磁盘加密

YAML
proposal: sm2_sm3_sm4-xts-128

适用场景:存储加密场景,而非通信加密。注意 XTS 模式仅用于磁盘数据加密,不应用于 IPSec 通信。

套件选择决策树

CODE
是否要求认证加密?
├── 是 → 使用 SM4-GCM(优先)或 SM4-CCM
└── 否 → 是否需要高性能?
    ├── 是 → SM4-GCM(即使未显式要求 AEAD)
    └── 否 → SM4-CBC(兼容最广泛)

IKEv2 国密化配置实战

配置文件结构

国密 IPSec 的配置文件通常位于 /etc/swanctl/swanctl.conf,主要修改 connections 和 ikev2 部分。

⚠️ 踩坑记录 1:DH 组编号错误

现象:IKE_SA 协商失败,日志显示 no proposal found。

原因:GM/T 0022-2023 定义的 SM2 椭圆曲线 DH 组编号为 19(对应 GM/T 0003.1 定义的 SM2 曲线),但部分旧版配置误用 14(P-256)或 192(MPTCP 扩展)。

解决方案:确认双方使用相同的 DH 组编号:

BASH
# 查看支持的 DH 组
swanctl --list-dh

如果远程端不支持 SM2 DH 组,需要启用混合模式(过渡期方案),同时支持 SM2 和 ECDH P-256。

⚠️ 踩坑记录 2:双证书路径配置

现象:IKE_AUTH 阶段证书验证失败,日志显示 certificate verify failed。

原因:国密 IPSec 要求签名证书和加密证书分别配置,但配置文件只写了一个证书路径。

解决方案:明确指定签名证书和加密证书的 PEM 路径:

CONF
local {
    auth = sign-encrypt
    # 签名证书(用于 IKE_AUTH 签名验证)
    identity = "CN=Branch-VPN, O=Company, C=CN"
    signing_cert = /etc/swanctl/certs/sm2-sign-cert.pem
    signing_key = /etc/swanctl/private/sm2-sign-key.pem
    
    # 加密证书(用于 ESP 加密关联)
    encrypting_cert = /etc/swanctl/certs/sm2-enc-cert.pem
    encrypting_key = /etc/swanctl/private/sm2-enc-key.pem
}

证书生成与签发

SM2 双证书生成

国密 IPSec 需要生成两对 SM2 证书:

  • 签名证书:用于 IKEv2 身份认证
  • 加密证书:用于 ESP 数据加密关联

CA 签发流程

如果企业有内部 CA,可以使用 GM/T 0034-2014 定义的证书签发流程:

关键扩展:

  • 签名证书:critical,MS_SM2_Signing OID 标识(1.2.156.10197.1.501)
  • 加密证书:critical,MS_SM2_Encryption OID 标识(1.2.156.10197.1.502)

⚠️ 踩坑记录 3:证书 OID 缺失

现象:对端证书验证通过,但 ESP SA 建立失败。

原因:证书缺少正确的 SM2 用途 OID 扩展,导致国密算法选择器无法匹配。

解决方案:确保证书签发时包含正确的扩展:

密钥管理体系

三层密钥结构

GM/T 0022-2023 定义了国密 IPSec 的三层密钥体系:

CODE
┌─────────────────────────────────────────────┐
│           主密钥 (SK_d)                      │
│         IKE_SA 协商产生                       │
├─────────────────────────────────────────────┤
│     派生密钥 (SK_ar, SK_ur)                  │
│     用于 IKE_AUTH 双向认证                    │
├─────────────────────────────────────────────┤
│   会话密钥 (SK_re, SK_ru)                    │
│   用于 ESP 数据加密/认证                      │
└─────────────────────────────────────────────┘

KDF 实现

国密 IPSec 使用 SM3 作为 PRF(伪随机函数),通过 HKDF 结构派生会话密钥:

⚠️ 踩坑记录 4:KDF 哈希函数误用

现象:IKE_SA 建立成功,但后续 ESP SA 协商失败。

原因:KDF 实现误用了 SHA-256 而非 SM3,导致派生出的密钥与对端不一致。

解决方案:严格使用 SM3 作为 PRF,并在配置中明确声明:

CONF
proposal {
    prf = sm3  # 必须,不能是 sha256
}

双证书切换与密钥轮换

定期轮换策略

GM/T 0022-2023 建议密钥轮换周期不超过 30 天(高安全场景)或 90 天(一般场景):

BASH
# 使用 swanctl 触发 IKE_SA 重协商
swanctl --reroute --child gm-subnet

# 或使用 systemctl 重启 strongswan(生产环境慎用)
systemctl restart strongswan-starter

密钥生命周期管理

timeline title 国密 IPSec 密钥生命周期 密钥生成 : 证书签发时生成 SM2 密钥对 IKE_SA 建立 : 协商产生 SK_d SK_d 派生 : 生成 SK_ar, SK_ur ESP 密钥派生 : 生成 SK_re, SK_ru 密钥轮换 : 周期到期或策略触发 密钥销毁 : 删除内存中的密钥材料

故障排查清单

常用诊断命令

BASH
# 查看当前 IKE_SA 状态
ipsec status

# 查看详细协商日志
swanctl --list-sa --verbose

# 测试端到端连通性
ping -c 3 10.1.0.1

# 抓包分析(国密 IPSec 报文)
tcpdump -i eth0 esp or ah

常见问题排查表

现象可能原因排查步骤
IKE_SA 无法建立算法套件不匹配对比双方 proposal 配置
证书验证失败OID 缺失或证书过期检查 certutil -L -d /etc/swanctl/certs
ESP SA 建立失败KDF 哈希函数错误确认 prf = sm3 配置
数据加密失败密钥材料不匹配检查nonce是否正确传递
性能低于预期SM4-GCM 未启用确认使用 GCM 而非 CBC 模式

日志关键字

BASH
# 查看国密相关日志
grep -i "sm2\|sm3\|sm4\|国密" /var/log/auth.log

# 查看 IKE 协商详情
journalctl -u strongswan -n 200 --no-pager

性能基准参考

基于 1GbE 环境实测数据(StrongSwan 7.x + Linux 5.15):

配置吞吐量CPU 占用延迟
SM4-CBC + HMAC-SM3180 Mbps45%1.2ms
SM4-GCM280 Mbps35%0.8ms
SM4-XTS (存储)320 Mbps30%-
结论:推荐使用 SM4-GCM 模式,性能优于 CBC 模式约 55%。

总结

国密 IPSec VPN 的改造不是简单的算法替换,而是需要从证书体系、密钥管理、算法套件到运维监控的系统性工程。本文聚焦的四个踩坑点(DH 组编号、双证书配置、证书 OID、KDF 哈希)是实际部署中最常见的失败原因。

建议改造顺序:

  • 第一阶段:验证国密算法支持(内核模块加载)
  • 第二阶段:配置双证书体系(签名/加密分离)
  • 第三阶段:启用 SM4-GCM 模式(性能优先)
  • 第四阶段:建立密钥轮换机制(合规要求)
完整协议原理可参考 IPSec VPN 国密协议详解,产品规范可查阅 GM/T 0023-2023。


参考标准: