主模式被设计成将密钥交换信息与身份认证信息相分离的一种交换技术。通过这种分离,得以将交换的身份信息进行加密保护,从而保证身份信息在传输过程中的安全性;
主模式总共需要经过 3 个步骤,共 6 条消息,来完成第一阶段的协商,最终建立 IKE SA;
这 3 个步骤分别是:模式协商;DH 交换、Nonce 交换;针对对方身份的验证;
主模式的特点包括身份保护以及对 ISAKMP 协商能力的完全利用。其中,身份保护在对方希望隐藏自己的身份时显得尤为重要。在我们讨论野蛮模式时,若使用预共享密钥方法验证,协商能力的完全利用与否也会凸显出其重要性;
主模式包含三次双向交换,用到了六条 ISAKMP 信息,协商过程如图 1 所示。这三次交换分别是:
消息 ① 和 ② 用于提议交换
发起方发送一个或多个 IKE 安全提议,响应方查找最先匹配的 IKE 安全提议,并将这个 IKE 安全提议回应给发起方。匹配的原则为协商双方具有相同的加密算法、认证算法、认证方法和 Diffie-Hellman 组标识;
消息 ③ 和 ④ 用于密钥信息交换
双方交换 Diffie-Hellman 公共值和 nonce 值,用于 IKE SA 的认证和加密密钥在这个阶段产生;
消息 ⑤ 和 ⑥ 用于身份和认证信息交换(双方使用生成的密钥发送信息)
双方进行身份认证和对整个主模式交换内容的认证;
详细交互过程
在消息 1、2 发送之前,协商发起者和响应者必须计算产生自己的 cookie,用于唯一标识每个单独的协商交换,cookie 使用 SRC-IP-ADDR/DST-IP-ADDR、随机数字、日期、时间进行 MD5 运算得出,并且放入消息 1 的 ISAKMP 中,用以标识单独的一个协商交换;
在第一次交换中
需要交换双方的 cookie 和 SA 载荷
在 SA 载荷中,携带需要协商的 IKE SA 的各项参数,包括:IKE 的散列类型、加密算法、认证算法、IKE SA 的协商时间限制、……
第一次交换后,第二次交换前,通信双方需要生成用于产生 Diffie-Hellman 共享密钥的 DH 值。生成方法是双方各自生成一个随机数字,通过 DH 算法对随机数字进行运算,得出一个 DH 值 Xa 和 Xb(Xa 是发起放的 DH 值,Xb 是响应者的 DH 值),然后双方再根据 DH 算法运算得出一个临时值 Ni 和 Nr;
在第二次交换中
双方交换各自的密钥交换载荷(即 DH 交换)以及临时值载荷(即 nonce 交换);
其中密钥交换载荷包含了 Xa 和 Xb,临时值交换包含了 Ni 和 Nr;
双方交换了临时值载荷 Ni 和 Nr 之后,配合事先预置好的预共享密钥,再通过为随机函数运算便可产生一个密钥 SKEYID,这个密钥使后续所有密钥生成的基础。随后,通过自己算出来的 DH 值、交换得到的 DH 值以及 SKEYID 进行运算便可产生一个只有双方才知道的共享密钥 SKEYID_d。此共享密钥并不进行传输,传输的只是是 DH 值以及临时值,因此即使第三方得到了这些材料也无法计算出共享密钥;
在第二次交换完成之后,双方所需的计算材料都已经交换完毕,此时,双方就可以将所有的密钥计算出来,并使用该密钥对随后的 IKE 消息提供安全保护。这些密钥包括:SKEYID_a、SKEYID_e、SKEYID_a 用来为 IKE 消息提供完整性以及数据源身份验证等安全服务;SKEYID_e 则用于对 IKE 消息进行加密;
在第三次交换中
是对标识载荷和散列载荷进行交换;
标识载荷包含发起者的标识信息、IP-ADDR 或主机名,
散列载荷包含上一过程中产生的三组密钥进行 HASH 运算得出的值;
此时,这两个载荷是通过 SKEYID_e 进行加密的,如果双方的载荷相同,那么认证成功;
至此,IKE Phase 1 主模式预共享密钥交换也就完成了;
实验观察
实验拓扑:
交互抓包(./ipsec-main-mode.pcapng):