DTLS-PSK算法抓包解析

本文详细介绍了DTLS-PSK的完整握手流程和会话恢复过程,通过抓包分析加深了对DTLS协议的理解。内容包括ClientHello、HelloVerifyRequest、ServerHello、ClientKeyExchange等步骤的解析,以及会话恢复时的交互过程。同时,提到了Scadium这一DTLS实现,并提供了相关技术参考链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、DTLS -PSK

PSK 是DTLS 定义的密钥交换方案之一,相对于公钥证书方案(如 ECDHA_RSA) 来说,其具备更加轻量化、高效的优点;
而目前 PSK方案应用也比较广泛。 关于DTLS协议可以看看前面的文章 DTLS要点解析

本次通过模拟的DTLS程序,对DTLS-PSK 握手流程进行抓包分析,以期加深对协议本身的理解。

二、完整握手

流程

         Client                                               Server
         ------                                               ------
         1.ClientHello                 -------->

                                     <--------    2..HelloVerifyRequest
                                                   (contains cookie)

         3.ClientHello                  -------->
         (with cookie)
                                                         4.ServerHello
                                      <--------      5.ServerHelloDone
         6.ClientKeyExchange
         7.ChangeCipherSpec
         8.Finished                     -------->
                                                    9.ChangeCipherSpec
                                      <--------             10.Finished

         Application Data             <------->     Application Data

步骤解析

~1. Client 发送ClientHello

==[ DTLS Record ]==============================================
Content Type: Handshake (22)
Peer address: localhost/127.0.0.1:5684
Version: 254, 253
Epoch: 0
Sequence Number: 0
Length: 82
Fragment:
    Handshake Protocol
    Type: CLIENT_HELLO (1)
    Peer: localhost/127.0.0.1:5684
    Message Sequence No: 0
    Fragment Offset: 0
    Fragment Length: 70
    Length: 70
        Version: 254, 253
        Random: 
            GMT Unix Time: Mon Jan 30 22:45:32 CST 2017
            Random Bytes: 4B 8B 3C CF 0F 62 57 99 94 E9 86 0A 46 68 BF 44 00 D1 34 45 FC 81 C3 AC BC 55 7E DB
        Session ID Length: 0
        Cookie Length: 0
        Cipher Suites Length: 4
        Cipher Suites (2 suites)
            Cipher Suite: TLS_PSK_WITH_AES_128_CCM_8
            Cipher Suite: TLS_PSK_WITH_AES_128_CBC_SHA256
        Compression Methods Length: 1
        Compression Methods (1 method)
            Compression Method: NULL
        Extensions Length: 24
            Extension: elliptic_curves (10)
                Length: 8
                Elliptic Curves Length: 6
                Elliptic Curves (3 curves):
                    Elliptic Curve: secp256r1 (23)
                    Elliptic Curve: secp384r1 (24)
                    Elliptic Curve: secp521r1 (25)
            Extension: ec_point_formats (11)
                Length: 2
                EC point formats length: 1
                Elliptic Curves Point Formats (1):
                    EC point format: uncompressed (0)
            Extension: server_certificate_type (20)
                Server certificate type: RAW_PUBLIC_KEY

===============================================================

此时没有携带Cookie,SessionID未生成;
Cipher Suites 携带了用于协商的算法集。

~2. Server 回复HelloVerifyRequest

    Handshake Protocol
    Type: HELLO_VERIFY_REQUEST (3)
    Peer: localhost/127.0.0.1:5684
    Message Sequence No: 0
    Fragment Offset: 0
    Fragment Length: 35
    Length: 35
        Server Version: 254, 253
        Cookie Length: 32
        Cookie: 77 25 7E 96 9E BD 39 42 94 5F 27 6C 8A 6D 9D D2 1A C9 A3 B8 62 1A 34 86 76 1D D7 AA F4 28 98 6D

Request中携带了32字节的Cookie。

~3. Client 再次发送ClientHello

==[ DTLS Record ]==============================================
Content Type: Handshake (22)
Peer address: localhost/127.0.0.1:5684
### 实现DTLS-SRTP安全通信 为了实现在Windows环境下使用C++和mbedtls库来建立DTLS-SRTP的安全通信,可以遵循以下方法: 在构建支持DTLS-SRTP的应用程序时,首先需要初始化mbedtls环境并配置必要的参数。这涉及到创建上下文结构体以及加载预定义的证书和私钥文件。 ```cpp #include "mbedtls/ssl.h" #include "mbedtls/net_sockets.h" // 初始化SSL/TLS上下文 void init_ssl_context(mbedtls_ssl_config &conf) { mbedtls_ssl_init(&conf); mbedtls_ctr_drbg_init(ctr_drbg); // 设置随机数生成器种子 entropy_init(&entropy); if ((ret = mbedtls_ctr_drbg_seed(ctr_drbg, mbedtls_entropy_func, &entropy, (const unsigned char *)pers, strlen(pers))) != 0) { printf(" failed\n ! mbedtls_ctr_drbg_seed returned %d", ret); goto exit; } } ``` 接着,在实际应用中应当调用`toUnifiedPlan(sdp)`函数处理会话描述协议(SDP),将其转换成统一计划格式以便更好地兼容WebRTC标准[^1]。然而此部分操作并不涉及底层传输层安全性(TLS)协商过程中的具体细节。 对于DTLS握手流程而言,则需通过mbedtls提供的API接口完成客户端和服务端之间的认证交换工作。这里需要注意的是,当采用SRTP作为媒体流加密机制时,必须确保双方就使用的密码套件达成一致意见,并正确传递密钥材料给libsrtp或其他负责解码音频视频数据包的相关组件。 最后一步就是编写事件循环监听网络连接状态变化情况,一旦检测到新的消息到来即刻解析其内容类型进而采取相应措施继续推进整个通讯进程直至结束为止。 #### 配置编译环境 考虑到目标平台为Microsoft Windows操作系统,建议利用Visual Studio集成开发工具链来进行项目搭建与调试作业。安装完成后记得勾选包含“Desktop development with C++”在内的选项以获取完整的桌面应用程序编程支持特性集。 另外还需下载最新版本[mbedtls源代码](https://tls.mbed.org/download)[^3]并将之加入工程依赖路径下;同样地,如果打算引入其他第三方开源软件比如opus编码器或者json解析器等也应按照相同方式处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值