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中完成。

3DTLS 握手

根据协议介绍,DTLS 握手包含如下几个步骤:

  1. WTP首先发送一个ClientHello消息来发起握手,说明它支持的密码算法列表、压缩方法及最高协议版本和其他一些需要的消息。
  2. AC回复一个HelloVerifyReuqest 消息,client必须重传添加了cookie的ClientHello。server然后验证cookie,如果有效的话才开始进行握手。
  3. AC回应一个ServerHello消息,包含服务器选择的连接参数,源自客户端初期所提供的ClientHello,确定了这次通信所需要的算法,然后发过去自己的证书(里面包含了身份和自己的公钥)。
  4. Client在收到这个消息后会生成一个秘密消息,用SSL服务器的公钥加密后传过去,SSL服务器端用自己的私钥解密后,会话密钥协商成功,双方可以用同一份会话密钥来通信了。

而在我们的代码中,

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中没有实现。

capwap DTSL 加密分析的更多相关文章

  1. capwap协议重点分析

    一.     CAPWAP概述 CAPWAP由两个部分组成:CAPWAP协议和无线BINDING协议. (1)CAPWAP协议是一个通用的隧道协议,完成AP发现AC等基本协议功能,和具体的无线接入技术 ...

  2. 37.前台js登陆加密分析

    开篇 由于现在的登陆接口如果明文传输的话,容易被暴力破解,越来越多的网站选择了前台js加密的方式,像这样: 或者这样: 枯了,对渗透造成一定的影响 本篇文章将系统的讲述使用Python对前台js加密爆 ...

  3. 关于某 App 请求参数 sign 字段加密分析

    受害者: 6ZqG5LyX5pWw5o2u 通过 Charles 抓包发现关键信息请求均携带 sign 参数,且每次请求的值都不一样: 使用 jadx 将对应的 apk 反编译并分析,全局搜素 &qu ...

  4. JAVA中简单的MD5加密类(MD5Utils)

    MD5加密分析:   JDK API:   获取对象的API:   加密的API:   package cn.utils; import java.security.MessageDigest; im ...

  5. http协议、加密解密、web安全

    今天,就简单讲讲,我学习的知识.http协议:http协议是超文本传输协议,是用于传输超媒文档的应用层协议,同时,http协议是无状态协议,意味着,在服务器两个请求之间不会保留任何数据.虽然通常基于T ...

  6. shiro入门学习--使用MD5和salt进行加密|练气后期

    写在前面 在上一篇文章<Shiro入门学习---使用自定义Realm完成认证|练气中期>当中,我们学会了使用自定义Realm实现shiro数据源的切换,我们可以切换成从关系数据库如MySQ ...

  7. 我去!爬虫遇到JS逆向AES加密反爬,哭了

    今天准备爬取网页时,遇到『JS逆向AES加密』反爬.比如这样的: 在发送请求获取数据时,需要用到参数params和encSecKey,但是这两个参数经过JS逆向AES加密而来. 既然遇到了这个情况,那 ...

  8. 第14天dbutils与案例

    第14天dbutils与案例 第14天dbutils与案例    1 1.    1.dbutils介绍    2 2.    2.dbutils快速入门    2 3.    3.dbutils A ...

  9. SuperWebClient -一个基于CURL的.NET HTTP/HTTPS模拟神组件(2)

    今天我们讨论SuperWebClient组件使用中的几个简单主题 1: UserAgent2: Cookies3: POST登录 1:UserAgent这个是客户端标识信息,此信息是用于鉴别正在访问W ...

随机推荐

  1. ORACLE 连接SQLSERVER 数据库备忘

    最近工作需要,要从SQL SERVER数据库中同步提取数据. 这里采用了  Oracle Gateway 来连接,折腾了半天,终于搞定,记录下已备下次使用. 基本资料网上都可以搜很多,官网配置说明在这 ...

  2. udev

    1.作为devfs的代替者,传统的devfs不能动态分配major和minor且有限,udev能像DHCP动态的分配IP一样去分配major和minor 2.device naming提供命名持久化机 ...

  3. 在Heroku上,安装Wordpress

    其實在 Heroku 上安裝 Wordpress 不會很難,不過閱讀之前,你可能先要知道 Heroku 與 git 的基本操作,建議可以先參考以下網站用 Heroku 架設 Wordpress 網站 ...

  4. PHP 捕捉错误,记录到日志

    register_shutdown_function("shutdown"); define('ERR_LOG_FILE', '/dev/shm/php_log.txt'); if ...

  5. 《JavaScript高级程序设计》读书笔记--前言

    起因 web编程过程使用javascript时感觉很吃力,效率很低.根本原因在于对javascript整个知识体系不熟,看来需要找些书脑补一下,同时欢迎众网友监督. 大神推荐书籍 看了博客大神们推荐的 ...

  6. uva 1339 Ancient Cipher

    大意:读入两个字符串(都是大写字母),字符串中字母的顺序可以随便排列.现在希望有一种字母到字母的一一映射,从而使得一个字符串可以转换成另一个字符串(字母可以随便排列)有,输出YES:否,输出NO:ex ...

  7. IOS UIButton用法详解

    这段代码动态的创建了一个UIButton,并且把相关常用的属性都列举了.希望对大家有用.   //这里创建一个圆角矩形的按钮UIButton *button1 = [UIButton buttonWi ...

  8. Angular JS的依赖注入

    依赖注入是一个在组件中给出的替代了硬的组件内的编码它们的依赖关系的软件设计模式.这减轻一个组成部分,从定位的依赖,依赖配置.这有助于使组件可重用,维护和测试. AngularJS提供了一个至高无上的依 ...

  9. 灰常好的开源项目[c/c++]

    ClibPDF http://cosoft.net.cn http://www2s.biglobe.ne.jp/~Nori/ruby/dist/ClibPDF-ALPHA-20010519.tar.g ...

  10. selenium+python环境搭建

    1.安装python-2.7.3.msi 2.安装pywin32-216.win32-py2.7.exe 3.下selenium包,selenium-2.35.0.tar.gz,放到D:\autote ...