刘骥宇,母军臣
(1.商丘师范学院软件学院,河南商丘476000;2.开封大学软件学院,河南开封475000)
IKEv2协议中消息协商的一种实现方案
刘骥宇1,母军臣2
(1.商丘师范学院软件学院,河南商丘476000;2.开封大学软件学院,河南开封475000)
IKEv2协议中最重要的内容是消息的协商,消息协商系统也是整个 IKEv2系统中的难点。本文实现的方案中,根据协商消息的转换定义了多个状态值和状态转换表,通过对状态转换的跟踪,完成整个协商交换。并使用交换得到的信息生成安全传输所需的密钥种子和各种密钥,成功建立IKE_SA和CHILD_SA。
IPsec;IKEv2;消息协商
IP安全协议 IPsec协议族[1]是组建VPN[2]所使用的一种主要协议,也是IETF为了弥补Internet的安全性缺陷而设计的。IPsec是一组开放标准集,协同工作来确保对等设备之间的数据机密性、数据完整性以及数据认证。
Internet密钥协商(IKE)协议是 IPsec协议族的重要协议之一,它的用途就是在 IPsec通信双方之间,动态建立起共享安全参数及验证过的密钥,即建立安全联盟(SA)。该协议的第二个版本(IKEv2)[3]简化了其第1个版本(IKEv1)中冗余的功能,增强了安全性[4-5]。其依靠公钥密码体制、私钥密码体制和 Hash函数,提供了多种交换模式和相关选项为IPsec服务。
IKEv2的消息协商过程对 IKEv1进行了很大的改进。IKEv1的协商流程非常复杂,采用2个阶段,4种模式。在第一阶段中选择使用主模式或野蛮模式,其中在主模式中需要六条交换消息,第二阶段的快速模式需要3条交换消息。并且根据不通的认证方法,交换的消息也不同,使得整个协商流程更加复杂。IKEv2取消了模式的概念 ,不存在“主模式”、“野蛮模式”、“快速模式”、“带身份保护的主模式”和“新组模式”等交换类型。IKEv2中的消息交换包括3种基本交换类型:初始交换(Initial Exchange)、协商子 SA交换(CREA TE_CH ILD_SA Exchange)和信息交换(INFORMA TIONAL Exchange)。
IKEv2协商SA分为2步实现:首先,在通信双方间建立1个经认证的安全信道,即建立 IKE SA;然后,在这个安全信道保护之下,为 IPsec安全服务协商SA,即建立IPsec SA。在IKEv2中,IKE SA仍然被称为IKE SA,而IPsec SA则被称为CHILD SA。为了更好的进行上述2步交换,需要进行一些控制和状态信息的交换。IKEv2相对于IKEv1在消息的数量和内容上都发生了不小的变化。
根据协议的特点,笔者使用C++语言,以面向对象的方法设计了1个IKEv2消息协商系统。
消息的处理主要由 Message类完成,Message类是对 IKEv2消息的抽象,1个Message对象就代表一条消息。它主要用来对IKEv2交换消息的属性及消息的分析、构造等操作进行描述。
为了表示 IKEv2协议中重新设置的4种新的交换类型,Message类中定义了1个枚举类型变量,如下所示:
enum EXCHANGE_TYPE{
IKE_SA_IN IT=34, /* IKE_SA_IN IT交换,值为34*/
IKE_AU TH, /* IKE_AU TH交换,值为35*/
CREA TE_CH ILD_SA, /* CREA TE_CH ILD_SA交换,值为36*/
INFORMA TIONAL /* 信息交换,值为37*/
};
Message类中主要成员函数如下:
1)添加载荷。在Message类中定义了2个载荷集合:unencrypted_payloads用来存放没有加密的载荷,encrypted_payloads用来存放加密载荷中的加密数据,即SK{…}中的载荷。而add Payload()成员函数就是将各个载荷添加到这2个集合中来,以便构造交换消息。添加载荷时是从尾部插入。
2)消息的构造。当接收到系统的指令,需要向通信对方发送消息时,就要按照IKEv2协议的定义进行构造消息,即将待发送的消息暂存到1个缓冲区内等待发送。在构造消息时,首先消息实体中对各个域的设置是在实施消息协商的IKE_SA_Controller类中完成,设置完毕后,由 Message类的generate Binary Representation()成员函数来完成对消息的构造,它将IKE消息头与上面介绍的2个载荷集合 unencrypted_payloads和encrypted_payloads添加进缓冲区中,等待向通信对端发送。构造消息流程图如图1所示。
图1 构造消息流程图
3)消息的分析。当接收到通信对方发送来的协商消息数据包时,应该按照IKEv2协议的定义对其进行分析,即将存入缓冲区的消息进行分析,分析出相应的 IKE头和携带的载荷。IKE头的各个域在Message类的构造函数中分析完成,消息中其余各个载荷的分析由M essage类的generatePayloads()成员函数来完成。分析消息流程图如图2所示。
图2 分析消息流程图
IKE_SA_Controller类负责通信双方进行协商消息,根据当前协商所处的状态和收到的消息,对进入的数据包进行分析处理,然后构造发送对端的数据包,进行协商,最终完成SA的建立。根据功能不同,可将其分为两部分,一部分负责状态转换表的操作,另一部分负责消息协商。
2.2.1 状态转换表的设计
消息协商过程中的状态信息比较复杂,可以定义一系列的标志进行标识,如标识是哪一对节点间的协商、协商所处的阶段、协商双方在此次协商中担任的角色等。而且协商时要交换许多信息,这些信息在计算密钥种子和各种密钥、身份认证等情况下使用,因此需要定义1个变量临时存放协商过程中的相关状态。在IKE_SA_Controller类中设计了1个状态转换表用来记录运行中的各个状态值。每个状态的转换都由1个事件激发,一旦1个事件发生,就会激发状态发生转换。即如果1个状态按照规定转换到下1个相应的状态值,则说明上1个动作正确完成了。这些状态值的意义如表1所示。
IKE_SA_Controller类中有关状态表的主要成员函数如下:
1)initializes State Tables():初始化状态转换表,即表2(空白之处为状态 STA TE_ERROR),由此可以看到各个状态的转换情况,协商中各个状态之间的转换将按照这个表来进行。
表1 State_Value(状态值表)
表2 State_Conversion(状态转换表)
2)createTransition():在进行构造状态表时使用,用来说明1个状态在受到特定事件激发时会转换到哪个状态。
3)getNextState():根据上1个状态和发生的事件,转换到1个新的状态,该成员函数返回新的状态值。
2.2.2 消息协商过程
在对IPsec数据包进行处理时,首先在内核的SAD中查找SA,如果没有相应的SA,则将启动IKEv2进程协商SA。响应建立SA请求并触发IKEv2进程进行消息协商的方式有以下2种:一种是收到内核发出的创建SA或更新SA的请求:SADB_ACQU IRE消息或SADB_EXPIRE消息;另一种是在收到对端IKEv2守护进程发出的协商SA的请求时,也启动协商交换以便能够响应对方的协商请求。
IKEv2协商被触发后,首先判断 IKE_SA是否存在。如果存在,则直接进行 CREA TE_CH ILD_SA阶段交换,协商建立该 IKE_SA保护下的CH ILD_SA;否则,开始 IN ITIAL阶段的消息交换,协商建立IKE_SA和CHILD_SA。
1)初始交换阶段协商。初始交换的协商由4条消息组成,包含2个交换:第一个是 IKE_SA_IN IT交换,第二个是 IKE_AU TH交换。交换完成,在 IKEv2交换实体间建立起 IKE_SA和第1个CH ILD_SA。
IKE_SA_IN IT交换由头2条消息完成,进行协商加密算法、交换 nonce值、完成Diffie-Hellman交换、计算后阶段所需要的各种密钥值。
首先,协商双方处于就绪状态。在该状态下,系统对于协商双方的连接描述已建立,可以进入IKE协商。当发起方接到系统开始协商的通知后开始构造第一条消息。构造消息时首先创建消息对象,设置消息头中的各域属性,然后构造消息头,接着顺序加入SAi载荷、KEi载荷和Ni载荷,这些载荷由载荷处理子系统进行构造。消息构造完成后放入缓冲区进行发送,这时协商发起方的状态值转换为状态1。
协商的响应方收到消息后,首先对其进行分析,得到消息头各域以及 SA载荷、KE载荷和NONCE载荷。然后检查收到的SA载荷中是否有合适的建议子结构,如没有,则向对方发送1个通知载荷并返回。如发现合适的建议子结构,则接着完成D-H交换。在响应方对接收到的消息分析处理完毕后,就开始构造第二条消息,按顺序构造消息头、SA r载荷、KEr载荷和N r载荷。消息构造完成后将其发送到对方,这时响应方进入状态4。然后响应方根据双方协商的载荷可生成SKYSEED以及后续交换所需要的各个密钥值。
发起方收到响应方发送的第二条消息后对其进行分析和检查,如果协商出合适的提议子结构和D-H组等值,则发起方开始计算SKYSEED以及后续交换所需要的各个密钥值。至此IKE_SA_IN IT交换结束并开始IKE_AU TH交换。
IKE_AU TH交换由后两条消息完成,主要进行认证前面发送的消息、交换身份标识和证书(可选)、建立第一个CH ILD_SA。
首先,消息发起方构造第三条消息所需要的消息头和载荷,从外面看,此消息只包括消息头和1个加密载荷,而 IDi载荷、AU TH载荷、SAi2载荷、TSi载荷和 TSr载荷都由加密载荷封装和保护。构造好载荷后将他们加入到消息中发送出去。这时发起方的状态值转换为状态2。响应方接收到第三条消息后,同样对该消息进行分析,得到相应的载荷并进行流量选择符的选择。然后根据协商的认证方法和密钥对消息进行验证,以检验其完整性。验证无误后开始构造第四条消息,构造完毕后将其送出。这时响应方的状态值转换为状态5。发送方接收并分析第四条信息,并对其完整性进行验证后完成IKE_AU TH交换并建立第1个CH ILD_SA。此时发起方的状态值转换为状态3。
2)CREA TE_CHILD_SA阶段交换。当在IKE_SA的保护下需要建立更多的CH ILD_SA或者需要重协商IKE_SA和CHILD_SA时,就需要进行CREATE_CHILD_SA交换。CREATE_CH ILD_SA交换可以选择交换 KE载荷,以支持完美向前保密,使CHILD_SA具有更强的保密性。协商中的任何一方均可发起 CREATE_CHILD_SA交换。
协商双方按照协议规定的消息的内容和格式调用载荷处理子系统构造消息中的载荷,然后构造要发送的消息。对于接收到的消息,交换的双方在构造完消息头后,进行检查 spi是否为0,如不为0则表示是安全联盟重协商;如果为0,则表示是建立CH ILD SA交换。然后检查是否有 KE载荷以支持完美向前保密。CREA TE_CH ILD_SA交换的消息都是经过加密的,具体处理过程同IN ITIAL交换的加密消息处理。
IKEv1低效的原因之一是其复杂的消息协商过程,IKEv2协议简化了 IKEv1冗余的功能,降低了复杂度,增强了安全性。本文提出的 IKEv2消息协商实现方案是整个IKEv2实现中最重要的部分,通过定义和跟踪协商的状态值,能高效完成IKEv2的消息协商并能成功建立安全联盟。
[1] Kent S,Seo K.Security Architecture for the Internet Pro tocol[S].RFC4301,2005.
[2] 戴宗坤,唐三平.VPN与网络安全[M].北京:电子工业出版社,2002.
[3] Kaufman C,et al.Internet Key Exchange(IKEv2)Protocol[S].RFC 4306,2005.
[4] Hussaina M,Hajjehb I,Afific H,et al.Tri-party IKEv2 in Home Networks[C].ICACT 07 Seoul,South Ko rea.
[5] Soussi H,Hussain M,Afifi H,et al.IKEv1 and IKEv2:A Quantitative Analyses[J].The Fourth World Enformatika Conference,2005(6):194-197.
Implementation for Message Negotiation in IKEv2 Protocol
Liu Jiyu1,Mu Junchen2
(1.School of Software,Shangqiu Normal University,Shangqiu,Henan 476000,China;2.School of Software,Kaifeng University,Kaifeng,Henan 475000,China)
The most important content of IKEv2 protocol is message negotiation and message negotiation system is the difficulty of the whole IKEv2 system.According to the conversion of consultation message,this paper defines a number of state values and state conversion table,and it completes the entire consultation exchange smartly through the state transition of the track.Also,it can use the information to generate the necessary seed and all kinds of secret keys.In this way,IKE_SA and CH ILD_SA are set up successfully.
IPsec;IKEv2;message negotiation
TP393.09
A
1671-2544(2010)06-0062-04
2010-09-02
刘骥宇(1978— ),男,河南商丘人,商丘师范学院软件学院助教,硕士。母军臣(1979— ),男,河南周口人,开封大学软件学院助教,硕士。
(责任编辑:陈锦华)