IKEv2协议关键知识点总结整理
1. IKEv2基本原理
2. IKEv2协议重点注意事项
2.1 情景一:IKEv2协商密钥逻辑
①密钥协商流程
pluto调试信息如下:
... ...
6.26 14:7:36 pluto(52881): KEY length: SK_d=0 SK_ai=0 SK_ar=0 SK_ei=0 SK_er=0 SK_pi=0 SK_pr=0
6.26 14:7:36 pluto(52881): shared: 12 16 4d 32 b8 3e 1e cb fe c4 08 29 dd 8d 14 31
6.26 14:7:36 pluto(52881): 07 29 0f 14 41 84 ea d3 50 9f ed 43 55 a7 e9 96
6.26 14:7:36 pluto(52881): a4 16 e6 47 a2 af ed 8b e4 1e 51 d2 bd 52 49 f0
6.26 14:7:36 pluto(52881): 18 1f d6 66 dd 8c 4e 43 52 78 4e 2a 1d 36 6d f8
6.26 14:7:36 pluto(52881): b2 2b e2 bd 1e c4 e4 bf cc 54 dd 99 1b 92 04 4e
6.26 14:7:36 pluto(52881): dd f5 b1 b3 43 84 df 22 bd e8 ef d3 05 c8 be bf
6.26 14:7:36 pluto(52881): skeyseed: 81 4d 5e 9f c1 7f 82 5b 75 73 f8 13 da f6 7b 20
6.26 14:7:36 pluto(52881): 3e a0 39 24
6.26 14:7:36 pluto(52881): SK_d:
6.26 14:7:36 pluto(52881): SK_ai:
6.26 14:7:36 pluto(52881): SK_ar:
6.26 14:7:36 pluto(52881): SK_ei:
6.26 14:7:36 pluto(52881): SK_er:
6.26 14:7:36 pluto(52881): SK_pi:
6.26 14:7:36 pluto(52881): SK_pr:
6.26 14:7:36 pluto(52881): ikev2 parent inI2outR2: calculating g^{xy}, sending R2
6.26 14:7:36 pluto(52881): processing connection IKEv1
6.26 14:7:36 pluto(52881): decrypting as RESPONDER, using INITIATOR keys
②函数调用关系
- ikev2parent_inI2outR2
- start_dh_v2
- send_crypto_helper_request
- pluto_do_crypto_op
- case pcr_build_kenonce:
- case pcr_build_nonce:
- case pcr_compute_dh_iv:
- case pcr_compute_dh:
- case pcr_compute_dh_v2:
- calc_dh_v2
- shared
- skeyseed
- SK_d
- SK_ai
- SK_ar
- SK_ei
- SK_er
- SK_pi
- SK_pr
- calc_dh_v2
- ikev2_parent_inI2outR2_tail
- finish_dh_v2
- st->st_shared
- st->st_skey_d
- st->st_skey_ai
- st->st_skey_ar
- st->st_skey_ei
- st->st_skey_er
- st->st_skey_pi
- st->st_skey_pr
- finish_dh_v2
- pluto_do_crypto_op
- send_crypto_helper_request
- start_dh_v2

③流程简述
IKEv2协商使用四个报文两次交换便完成IPSec隧道的协商建立。前两个报文用来协商IKE-SA的策略,发起方在收到响应方的应答后进行密钥的计算,而响应方是在收到发起方第三个报文后再进行各个密钥的计算生成(也就是ikev2_parent_inI2outR2()中,最终调用calc_dh_v2()完成密钥生成),之后在ikev2_parent_inI2outR2_tail()中通过finish_dh_v2()将生成的密钥存储在state上。
2.2 情景二:使用IKEv2时,协商报文认证失败
①初步分析定位

通过抓包发现是在收到第三个协商报文后,出现错误导致没有应答报文。打开pluto日志信息发现时由于认证失败导致的。而发起方在收到第四个报文后也会出现该问题。下面时发前方收到第四个报文后的信息。
7.1 9:33:7 pluto(49216): ikev2 parent inR2: calculating g^{xy} in order to decrypt I2
7.1 9:33:7 pluto(49216): decrypting as INITIATOR, using RESPONDER keys
7.1 9:33:7 pluto(49216): data being hmac: 65 d0 57 0a 93 0c 90 ac a9 d9 44 45 75 56 1a f2
7.1 9:33:7 pluto(49216): 2e 20 23 20 00 00 00 01 00 00 00 74 24 00 00 58
7.1 9:33:7 pluto(49216): ee 58 f5 c7 50 d4 6e 87 db 11 4f 36 b7 e7 92 0c
7.1 9:33:7 pluto(49216): a3 cb ff e5 54 c3 f1 47 f4 17 ca 2e 26 99 10 c0
7.1 9:33:7 pluto(49216): d0 90 5a aa 51 33 c0 27 53 6c 36 a3 d9 c0 b8 3b
7.1 9:33:7 pluto(49216): 0f 6c fa a9 4a 9a 7d f6 c3 12 eb 04 04 c6 7e fc
7.1 9:33:7 pluto(49216): bd 97 f6 4e 79 58 04 39
7.1 9:33:7 pluto(49216): R2 calculated auth: 05 e1 bf 2d 1a ba 0e ea 9a cd 1f 23
7.1 9:33:7 pluto(49216): R2 provided auth: f4 17 ca 2e 26 99 10 c0 50 d4 6e 87
7.1 9:33:7 pluto(49216): R2 failed to match authenticator
②函数调用关系
- ikev2parent_inR2
- ikev2_decrypt_msg
- 认证(就是报文的完整性检查)
- authkey = &pst->st_skey_ar; 认证密钥
- pst->st_oakley.integ_hasher;认证算法
- 实际的报文认证部分; 认证数据
- 计算哈希值;认证结果
- 比较收到的认证数据与计算出的数据
- 解密
- cipherkey = &pst->st_skey_er;
- pst->st_oakley.encrypter
- 从报文中获取初始向量:IV
- … …
- ikev2_process_encrypted_payloads
- 解析每一个载荷
- 认证(就是报文的完整性检查)
- ikev2_decrypt_msg
- ikev2parent_inR1outI2 或 ikev2_parent_inI1outR1_tail
- ikev2_parse_parent_sa_body
- sadb = oakley_alg_makedb(st->st_connection->alg_info_ike;本地策略转换为SA
- sa_v2_convert(sadb); IKEv1 SA转换为IKEv2 SA。
- ikev2_process_transforms; 解析对方的建议载荷
- ikev2_match_transform_list_parent; 将对端建议载荷与本端配置进行匹配
- 填充加密算法:ta.encrypter
- 填充认证算法:ta.integ_hasher
- 填充PRF算法:ta.prf_hasher
- 填充DH组:ta.group
- 将算法存储到state上:st->st_oakley = ta;
- ikev2_parse_parent_sa_body
③IKEv2的重点说明
3.1 常用的加解密、认证算法:
这里需要注意的一点是:完整性检测算法(认证算法)有两个标准算法:MD5, SHA1;他们的hash_integ_len是固定的96bits==12Bytes。

static struct hash_desc crypto_hasher_md5 =
{
common: {name: "oakley_md5",
officname: "md5",
algo_type: IKE_ALG_HASH,
algo_id: OAKLEY_MD5,
algo_v2id: IKEv2_PRF_HMAC_MD5,
algo_next: NULL, },
hash_ctx_size: sizeof(MD5_CTX),
hash_key_size: MD5_DIGEST_SIZE,
hash_digest_len: MD5_DIGEST_SIZE,
hash_integ_len: 0, /*Not applicable*/
hash_init: (void (*)(void *)) osMD5Init,
hash_update: (void (*)(void *, const u_int8_t *, size_t)) osMD5Update,
hash_final: (void (*)(u_char *, void *)) osMD5Final,
};
static struct hash_desc crypto_integ_md5 =
{
common: {name: "oakley_md5",
officname: "md5",
algo_type: IKE_ALG_INTEG,
algo_id: OAKLEY_MD5,
algo_v2id: IKEv2_AUTH_HMAC_MD5_96,
algo_next: NULL, },
hash_ctx_size: sizeof(MD5_CTX),
hash_key_size: MD5_DIGEST_SIZE,
hash_digest_len: MD5_DIGEST_SIZE,
hash_integ_len: MD5_DIGEST_SIZE_96,
hash_init: (void (*)(void *)) osMD5Init,
hash_update: (void (*)(void *, const u_int8_t *, size_t)) osMD5Update,
hash_final: (void (*)(u_char *, void *)) osMD5Final,
};
static struct hash_desc crypto_hasher_sha1 =
{
common: {name: "oakley_sha",
officname: "sha1",
algo_type: IKE_ALG_HASH,
algo_id: OAKLEY_SHA,
algo_v2id: IKEv2_PRF_HMAC_SHA1,
algo_next: NULL, },
hash_ctx_size: sizeof(SHA1_CTX),
hash_key_size: SHA1_DIGEST_SIZE,
hash_digest_len: SHA1_DIGEST_SIZE,
hash_integ_len: 0, /*Not applicable*/
hash_init: (void (*)(void *)) SHA1Init,
hash_update: (void (*)(void *, const u_int8_t *, size_t)) SHA1Update,
hash_final: (void (*)(u_char *, void *)) SHA1Final,
};
static struct hash_desc crypto_integ_sha1 =
{
common: {name: "oakley_sha",
officname: "sha1",
algo_type: IKE_ALG_INTEG,
algo_id: OAKLEY_SHA,
algo_v2id: IKEv2_AUTH_HMAC_SHA1_96,
algo_next: NULL, },
hash_ctx_size: sizeof(SHA1_CTX),
hash_key_size: SHA1_DIGEST_SIZE,
hash_digest_len: SHA1_DIGEST_SIZE,
hash_integ_len: SHA1_DIGEST_SIZE_96,
hash_init: (void (*)(void *)) SHA1Init,
hash_update: (void (*)(void *, const u_int8_t *, size_t)) SHA1Update,
hash_final: (void (*)(u_char *, void *)) SHA1Final,
};
3.2 IKEv1与IKEv2在建议载荷上的区别
IKEv2的建议载荷:

IKEv1的建议载荷:

IKEv1与IKEv2除了载荷类型不同,报文的结构也发生了变化,IKEv2中没有了属性载荷,相反IKEv1中的每一个属性载荷对应IKEv2中的一个变化载荷。因此IKEv2在oakley_alg_makedb()生成SA后需要sa_v2_convert()进行依次格式转换,转换为IKEv2的SA格式。
3.3 关于配置参数问题
3.3.1 IPSec隧道IKE-SA协商阶段可以配置的参数:
- 认证方式:
- 预共享密钥
- 数字证书
- 加密算法
- DES
- 3DES
- AES
- SM4
- 哈希算法
- MD5
- SHA1
- SM3
- DH组
- DH1
- DH2
- DH5
- openswan源码中的DH包含:
enum ike_trans_type_dh {
OAKLEY_GROUP_MODP768 = 1,
OAKLEY_GROUP_MODP1024 = 2,
OAKLEY_GROUP_GP155 = 3,
OAKLEY_GROUP_GP185 = 4,
OAKLEY_GROUP_MODP1536 = 5,
OAKLEY_GROUP_MODP2048 = 14,
OAKLEY_GROUP_MODP3072 = 15,
OAKLEY_GROUP_MODP4096 = 16,
OAKLEY_GROUP_MODP6144 = 17,
OAKLEY_GROUP_MODP8192 = 18,
#ifdef USE_MODP_RFC5114
OAKLEY_GROUP_DH22 = 22,
OAKLEY_GROUP_DH23 = 23,
OAKLEY_GROUP_DH24 = 24,
#endif
};
3.3.2 IKEv2中PRF算法是怎么来的:
PRF算法与认证算法都是使用hash进行计算的,NGFW中无法进行单独配置,而是同时配置两者保持一致。除此之外:MD5和SHA1算法的值是相同的在PRF算法和完整性算法中
PRF算法包括:
enum ikev2_trans_type_prf {
IKEv2_PRF_HMAC_MD5 = 1, /* RFC2104 */
IKEv2_PRF_HMAC_SHA1 = 2, /* RFC2104 */
IKEv2_PRF_HMAC_TIGER = 3, /* RFC2104 */
IKEv2_PRF_AES128_XCBC = 4, /* RFC4434 */
IKEv2_PRF_HMAC_SHA2_256 = 5, /* RFC4868 */
IKEv2_PRF_HMAC_SHA2_384 = 6, /* RFC4868 */
IKEv2_PRF_HMAC_SHA2_512 = 7, /* RFC4868 */
IKEv2_PRF_AES128_CMAC = 8, /* RFC4615 */
/* 9 - 1023 Reserved to IANA RFC4306 */
/* 1024 - 65535 Private Use RFC4306 */
IKEv2_PRF_INVALID = 65536,
};
认证算法(完整性算法)包括:
enum ikev2_trans_type_integ {
IKEv2_AUTH_NONE = 0, /* RFC4306 */
IKEv2_AUTH_HMAC_MD5_96 = 1, /* RFC2403 */
IKEv2_AUTH_HMAC_SHA1_96 = 2, /* RFC2404 */
IKEv2_AUTH_DES_MAC = 3, /* RFC4306 */
IKEv2_AUTH_KPDK_MD5 = 4, /* RFC1826 */
IKEv2_AUTH_AES_XCBC_96 = 5, /* RFC3566 */
IKEv2_AUTH_HMAC_MD5_128 = 6, /* RFC4595 */
IKEv2_AUTH_HMAC_SHA1_160 = 7, /* RFC4595 */
IKEv2_AUTH_AES_CMAC_96 = 8, /* RFC4494 */
IKEv2_AUTH_AES_128_GMAC = 9, /* RFC4543 */
IKEv2_AUTH_AES_192_GMAC = 10, /* RFC4543 */
IKEv2_AUTH_AES_256_GMAC = 11, /* RFC4543 */
IKEv2_AUTH_HMAC_SHA2_256_128 = 12, /* RFC4595 */
IKEv2_AUTH_HMAC_SHA2_384_192 = 13, /* RFC4306 */
IKEv2_AUTH_HMAC_SHA2_512_256 = 14, /* RFC4306 */
/* 15 - 1023 Reserved to IANA RFC4306 */
/* 1024 - 65535 Private Use RFC4306 */
IKEv2_AUTH_INVALID =65536
};
2.3 情景三:与业务流量相关注意事项
①函数调用关系
- ikev2parent_inR2
- ikev2_decrypt_msg
- 完整性检查
- st->st_oakley.integ_hasher
- 完整性检查
- ikev2_decode_peer_id
- ikev2_decode_local_id
- PRF计算ID的HASH值
- v2_AUTH_RSA
- ikev2_verify_rsa_sha1
- v2_AUTH_SHARED
- ikev2_verify_psk_auth
- ikev2_calculate_psk_sighash
- get_preshared_secret
- st->st_oakley.prf_hasher
- 对端的首包
- 对端的Nonce载荷数据
- 对端的ID的哈希值
- ikev2_calculate_psk_sighash
- ikev2_verify_psk_auth
- ikev2_child_validate_responder_proposal
- ikev2_parse_child_sa_body
- p2alg = kernel_alg_makedb(c->policy , c->alg_info_esp; 根据当前配置生成IPSecSA载荷
- sa_v2_convert; 将IPSecSA载荷转换为IKEv2的格式类型
- ikev2_process_transforms; 解析对端响应的ipsec-SA的建议载荷
- ikev2_match_transform_list_child;本端配置和对端选择的ipsec-SA载荷进行匹配
- ta.encrypter; 保存加密算法
- ta.integ_hash; 保存完整性检测算法
- st->st_esp.attrs.transattrs = ta; 将匹配的算法存储到state上
- st->st_esp.present = TRUE; 封装协议标记位
- ikev2_child_notify_process
- ikev2_derive_child_keys 最关键的生成数据流量秘钥函数接口
- childsacalc.prf_hasher
- childsacalc.ni
- childsacalc.nr
- childsacalc.spii
- childsacalc.spir
- childsacalc.skeyseed = &st->st_skey_d; 使用了st->st_skey_d
- st->st_esp.present = TRUE;
- st->st_esp.keymat_len=enc_len + auth_len;
- st->st_esp.peer_keymat=v2genbytes(childsacalc, …)
- st->st_esp.our_keymat=v2genbytes(childsacalc, …)
- install_ipsec_sa
- … …
- ikev2_decrypt_msg
②重点说明
3.1 PRF算法的使用
在IKEv2中PRF算法的应用场景有:
认证数据来源的可靠性
例如
ikev2_calculate_psk_sighash()中使用PRF算法、ID、共享秘钥、对端首包、对端Nonce等对数据报文进行认证,从而确保数据包来源的可靠性。生成IPSec SA的加密秘钥和认证秘钥
在
ikev2_derive_child_keys()中,使用PRF算法、双方的Nonce值、SPI、以及先前生成的st_skey_d等生成用于数据流量的加密、认证等的秘钥材料。

3.2 关键名词

- 完整性
即对报文的完整性检查,在ipsec中经常也称为认证(authenticator), 它是对整个报文做哈希(准确的说应该不是整个报文),然后将结果添加到报文的末尾。 这个长度目前好像是固定的12字节,即96位(MD5和SHA1都是)。它使用st->st_oakley.integ_hasher进行哈希。见上图中最后12字节数据。
- 认证载荷
个人理解认证载荷是为了保证数据来源的可靠性,一般包括两种:预共享秘钥和数字证书。它的检查更为严格,以共享秘钥为例:它会对对方的首个报文、Nonce值、ID值同时计算哈希,而不仅仅计算当前报文的内容。认证载荷中填充的数据便是对端对上述内容计算的哈希值。
IKEv2协议关键知识点总结整理的更多相关文章
- web开发前端面试知识点目录整理
web开发前端面试知识点目录整理 基本功考察 关于Html 1. html语义化标签的理解; 结构化的理解; 能否写出简洁的html结构; SEO优化 2. h5中新增的属性; 如自定义属性data, ...
- spring-cloud-kubernetes背后的三个关键知识点
在<你好spring-cloud-kubernetes>一文中,对spring-cloud-kubernetes这个SpringCloud官方kubernetes服务框架有了基本了解,今天 ...
- Java异常的10个关键知识点
前言 总结了Java异常十个关键知识点,面试或者工作中都有用哦,加油. 一. 异常是什么 异常是指阻止当前方法或作用域继续执行的问题.比如你读取的文件不存在,数组越界,进行除法时,除数为0等都会导致异 ...
- 【体系结构】有关Oracle SCN知识点的整理
[体系结构]有关Oracle SCN知识点的整理 1 BLOG文档结构图 BLOG_Oracle_lhr_Oracle SCN的一点研究.pdf 2 前言部分 2.1 导读和注意事项 各位技 ...
- Java程序员必备:异常的十个关键知识点
前言 总结了Java异常十个关键知识点,面试或者工作中都有用哦,加油. 一. 异常是什么 异常是指阻止当前方法或作用域继续执行的问题.比如你读取的文件不存在,数组越界,进行除法时,除数为0等都会导致异 ...
- IKEv2协议协商流程: (IKE-SA-INIT 交换)第二包
IKEv2协议协商流程: (IKE-SA-INIT 交换)第二包 文章目录 IKEv2协议协商流程: (IKE-SA-INIT 交换)第二包 1. IKEv2 协商总体框架 2. 第二包流程图 3. ...
- IKEv2协议协商流程: (IKE-SA-INIT 交换)第一包
文章目录 1. IKEv2 协商总体框架 2. 第一包流程图 3. openswan源码学习 3.1 ikev2parent_outI1() 3.2 ikev2parent_outI1_withsta ...
- DDD关键知识点整理汇总
创建领域对象采用构造函数或者工厂,如果用工厂时需要依赖于领域服务或仓储,则通过构造函数注入到工厂: 一个聚合是由一些列相联的Entity和Value Object组成,一个聚合有一个聚合根,聚合根是E ...
- Node.js的知识点框架整理
背景:因为appium是基于Node.js的,所以想看一下Node.js.但是发现很多资料的顺序看起来有点颠倒.然后就一面看资料一面整理了一下大概的知识点框架,希望对自己对别人有用. 本文不包含nod ...
随机推荐
- anyRTC SDK 5月迭代:优化自定义加密功能,让通信更安全
anyRTC SDK 5月上新,新增多种加密类型,让实时音视频通信更安全:新增移动端推流支持1080P分辨率的支持:此外还对事件上报.日志详情.数据统计.网络传输等多项功能进行了优化改进. 以下为更新 ...
- 【SpringCloud技术专题】「原生态Fegin」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(上)
前提介绍 Feign是SpringCloud中服务消费端的调用框架,通常与ribbon,hystrix等组合使用. 由于遗留原因,某些项目中,整个系统并不是SpringCloud项目,甚至不是Spri ...
- linux笔记2随笔
124.diff命令:文件内容对比 diff命令用于比较多个文本文件之间的差异,这在系统安全防范中非常重要.比如当黑客入侵系统之后,往往会修改一些系统配置文件,从而留下一些后门. 所以作为运维人员.最 ...
- 小白学习vue第五天-第二弹(全局局部、父子、注册语法糖,script/template抽离模板)
全局组件: 就是注册的位置在实例对象的外面 并且可以多个实例对象使用 而局部: 就是在实例对象的内部注册 父组件和子组件的关系 子组件就是在另一个组件里面注册的组件 组件注册语法糖: 就不用Vue.e ...
- Moco框架jar下载
下载地址: https://repo1.maven.org/maven2/com/github/dreamhead/moco-runner/0.10.0/ 选择如下图下载 下载成功即可使用
- 慕慕生鲜上线&&腾讯云服务器配置准备
1.购买服务器并配置环境 1.1 购买 618购买了腾讯云服务器三年最低配置(1核2G 1Mbps 50G云盘),一时激动忘记了购买前领优惠券,痛失25元. 1.2 环境配置 系统是 CentOS L ...
- 【笔记】scikit-learn中的PCA(真实数据集)
sklearn中的PCA(真实的数据集) (在notebook中) 加载好需要的内容,手写数字数据集 import numpy as np import matplotlib.pyplot as pl ...
- spring-data-jdbc的基础使用(一)
前言 很多人知道Mybatis,知道Jpa,但是对spring-data-jdbc可能了解的少之又少.注意我们这里说的是data-jdbc,而不是普通的jdbc.它拥有了类似jpa的一些特性,比如能够 ...
- docker 部署mysql连接问题
发现windows上有一个docker descktop(虽然不怎么好用), 安装之后准备直接用docker搭本地测试环境的基础设施(比如MySQL,Redis,MongoDB,ES啥的), 虽然比去 ...
- NOIP 模拟 $13\; \text{玄学题}$
题解 题如其名,是挺玄学的. 我们发现每个值是 \(-1\) 还是 \(1\) 只与它的次数是奇是偶有关,而 \(\sum_j^{j\le m}d(i×j)\) 又只与其中有多少个奇数有关 对于 \( ...