dtls在传输层和应用层之间,用于进行密钥交换、数据加密、数字签名,其作用于udp。而tls作用于tcp。dtls是tls的子集
dtls握手过程
其流程与TLS概念上是一致的,其中Flight对应一次通过网络发送的数据包;HelloVerifyRequest 用于服务端对客户端实现二次校验;Certificate是交换的证书,由协商后的算法确定是否需要传输;当服务端要求验证客户端身份时,发起CertificateRequest,此时客户端需要发送证书;ChangeCipherSpec是一个简单的标记,标明当前已经完成密钥协商,可以准备传输;Finished消息表示握手结束,通常会携带加密数据由对端进行初次验证。
ciphersuite
由于网络 IO 限制,DTLS 只支持 TLS 的子集:
- 密钥交换算法 ECDHE_RSA,这是由 ECC 和 DH 密钥交换算法衍生出来的算法;
- 动态密钥算法 AES_128_GCM,用于实现数据包的加解密;
- MAC 算法 HMAC_SHA256,用于创建加密数据块的摘要;
- 伪随机函数 PRF,TLS1.2 定义其与 MAC 算法一致。
几个常用的 CipherSuite:
• TLS_PSK_WITH_AES_128_CBC_SHA256
• TLS_PSK_WITH_AES_128_CCM_8
• TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
• TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
防护机制
握手
- 重传
– DTLS 使用超时重传机制来确保握手消息的到达。 - 顺序
– UDP 本身不对消息传输的顺序负责,为了保证握手消息按序传输,每一个 Handshake 报文都分配了一个特殊的序列号,接收方直接处理属于当前步骤的消息,对于提前到达的消息则放到缓存队列中。 - 分段
– 由于 MTU 限制,DTLS 要求对握手消息实现分段,每一个握手消息都可能包含分段的位移和长度,由接收端组装。 - 重复
– DTLS 选择性的支持消息重放检测机制,使用的技术与 IPsec AH/ESP 相同,由接收方维护一个 bitmap 窗口,因老化而不适合窗口的记录和以前接收过的记录都会被悄悄地丢弃。
数据包重传
DTLS 为每个加密数据包增加了 MAC 鉴权摘要,用于保证数据包的完整性;此外显式附带了一个 SN 号用于排序。
dos攻击
DTLS 定义了基于 cookie 验证的机制来预防攻击,如前面流程中涉及的 HelloVerifyRequest 便是用于进行 cookie 验证。
Cookie 的算法:HMAC(Secret, Client-IP, Client-Parameters)
其中 Secret 由 server 端内置,用于计算 cookie 值,client 端需要在接收到 VerifyRequest 后提供同样的 cookie 值;
server 端根据发送方 IP 计算 cookie 值,一旦发现不一致则判定为非法数据。
会话恢复
握手流程所占的开销是比较大的,与 TLS 类似,DTLS 也定义了会话恢复机制
握手成功之后,服务端将生成 SessionID 返回,客户端在下次连接时附带 SessionID;若验证通过,可直接沿用原有的会话数据,包括协商算法和密钥。