不管IKEv1还是IKEv2都要求IKE连接和和IPSec连接定期更新密钥。对于IPSec连接就是Rekey操作就是建立新的连接然后把旧连接删掉。
对于IKEv1中的IKE连接也是建立新的IKE连接然后把旧的IKE连接删掉,对于IKEv2则可以通过create_child_ca操作创建新的IKE SA不用重新初始化IKE连接,当然新建再删除的方法仍然可以用(如果需要重新认证)。
在IKE SA重新生成的时候必须重新发送DH公钥并生成新的共享密钥,不管IKEv1还是IKEv2。对于IPSec SA重新生成时跟据是否开启PFS,如果开启PFS则建立IPSec SA时也要重新发送DH公钥并生成新的共享密钥,如果没有开启PFS则重用IKE SA中的共享密钥。
每次Rekey时都会以g^ir(DH协商的共享密钥,根据情况可以是新的,也可以是旧的,如果没有开启PFS则会始终使用IKE SA中旧的DH共享密钥),SK_d,随机数及其它参数一起作为密钥材料生成新的密钥。
IKE_INIT_SA首次连接时的密钥计算:
SKEYSEED = prf(Ni | Nr, g^ir)
{SK_d | SK_ai | SK_ar | SK_ei | SK_er | SK_pi | SK_pr }
= prf+ (SKEYSEED, Ni | Nr | SPIi | SPIr )
SK_d 用于为使用此 IKE SA 建立的子 SA 派生新密钥;SK_ai 和 SK_ar 用作完整性保护算法的密钥,用于验证后续交换的组件消息;SK_ei 和 SK_er 用于加密(当然还有解密)所有后续交换;SK_pi 和 SK_pr 用于生成 AUTH 有效负载。SK_d、SK_pi 和 SK_pr 的长度必须是商定的 PRF 的首选密钥长度。
CREATE_CHILD_SA的密钥计算(也用于rekey):
SKEYSEED = prf(SK_d (old), g^ir (new) | Ni | Nr)
prf用于生成key seed,prf+可以一次性生成7个不同用途的密钥
IKE_INIT_SA和CREATE_CHILD_SA必须生成新的nonce用于prf派生新的seed和密钥,nonce必须是128位以上的长度而且必须是prf密钥长度的一半以上。