1、问题提出
在配隧道时发现两种情况:
1、配了两边的证书情况,会发送CR 负载。
2、配了一边的证书和对端的--id,不会发送。
那么代码中是怎么实现的?
2、截包对比(port 500 or isakmp protocol)
如果需要发送CR负载那么首先发送的是接收方(即第四个协商包)。
发送方 接收方
<------第四个包发送证书请求负载。
第五个包组包时先校验证书相关信息然后把证书信息组到包里发给对方-------->
<---------第六个包接收到信息后进行解析,校验相关工作,并把自己的证书发给对方。
3、分析过程
理清思路:第五个包接收到第四个包的证书请求,发送证书给对方。那么第四个包为什么会发送这个证书请求?因为第四个包
main_inI2_outR2()
->build_ke()
->send_crypto_helper_request()
->pluto_do_crypto_op() // Public DH value都在这里组包,还有keyex value
-> (*cn->pcrc_func)(cn, r, NULL);//这个在调用build_ke()时已经赋值为:main_inI2_outR2_continue()
->main_inI2_outR2_continue()
->main_inI2_outR2_tail()
send_cr = !no_cr_send
&& (st->st_oakley.auth == OAKLEY_RSA_SIG)
&& !has_preloaded_public_key(st)
&& st->st_connection->spd.that.ca.ptr != NULL;
if(send_cr) //为真下一负载即为证书请求负载。
{
next_payload = ISAKMP_NEXT_CR;
}
下面看send_cr何时为真?
no_cr_send这个全局变量默认为0,可以通过./pluto --nocrsend强制设置;如果使用的是非PSK认证,那么st->st_oakley.auth会在加链接的时候就会设置此值为OAKLEY_RSA_SIG(3);那么has_preloaded_public_key(st)为什么为假呢?st->st_connection->spd.that.ca.ptr何时不为空呢?
***、首先看has_preloaded_public_key(st)什么时候为真(为真时不发送CR负载),什么时候为假(为假时发送CR负载)。