1、概述
DTLS即Datagram Transport Layer Security (RFC4347),AP加入AC前,先进行DTLS验证,当AP与AC之间的DTLS握手成功后,AP发出Join请求开始请求加入。这个过程里面的所有报文均为加密报文。以下为报文格式(摘自RFC5418):
在我们的代码中是在CWWTPEnterJoin()函数中来实现的。
2、代码分析
主要的函数以下几个过程:
CWStateTransition CWWTPEnterJoin() {
//初始化socket gWTPSocket
/* Init DTLS session */
if(!CWErr(CWNetworkInitSocketClient(&gWTPSocket,
&(gACInfoPtr->preferredAddress))) ) {
timer_rem(waitJoinTimer, NULL);
return CW_ENTER_DISCOVERY;
}
#ifndef CW_NO_DTLS
if(gACInfoPtr->security == CW_X509_CERTIFICATE) {//需要授权书
if(!CWErr(CWSecurityInitContext(&gWTPSecurityContext,//初始化wtp本地加密策略
"root.pem",
"client.pem",
"prova",
CW_TRUE,
NULL)))
}
#endif
CWThread thread_receiveFrame;
if(!CWErr(CWCreateThread(&thread_receiveFrame, //开启接受dtls数据的线程
CWWTPReceiveDtlsPacket,
(void*)gWTPSocket)))
#ifndef CW_NO_DTLS
if(!CWErr(CWSecurityInitSessionClient(gWTPSocket,//初始化DTSL会话
&(gACInfoPtr->preferredAddress),
gPacketReceiveList,
gWTPSecurityContext,
&gWTPSession,
&gWTPPathMTU)))
if(!CWErr(CWWTPSendAcknowledgedPacket(seqNum, //发起Join 会话请求。
NULL,
CWAssembleJoinRequest,
(void*)CWParseJoinResponseMessage,
(void*)CWSaveJoinResponseMessage,
&values)))
CWLog("Join Completed");
return CW_ENTER_CONFIGURE;
}
DTSL会话初始化主要在CWSecurityInitSessionClient中完成。
3、DTLS 握手
根据协议介绍,DTLS 握手包含如下几个步骤:
而在我们的代码中,
CWDebugLog("Before HS");
CWSecurityManageSSLError(SSL_do_handshake(*sessionPtr),
*sessionPtr,
SSL_free(*sessionPtr););
CWDebugLog("After HS");
if (SSL_get_verify_result(*sessionPtr) == X509_V_OK) {
CWDebugLog("Certificate Verified");
} else {
CWDebugLog("Certificate Error (%d)",
SSL_get_verify_result(*sessionPtr));
}
总结:
DTLS 握手是通过SSL_do_handshake这个函数来实现的,而在我们上次的调试过程中发现也是这个地方出错。但是这个函数是openSSL加密库的函数,在openCawwap中没有实现。