DTLS(Datagram Transport Layer Security)即数据包传输层安全性协议。TLS不能用来保证UDP上传输的数据的安全,因此Datagram TLS试图在现存的TLS协议架构上提出扩展,使之支持UDP,即成为TLS的一个支持数据包传输的版本。
- DTLS 1.0 基于 TLS 1.1
- DTLS 1.2 基于TLS 1.2。
简介
UDP协议是不面向连接的不可靠协议,且没有对传输的报文段进行加密,不能保证通信双方的身份认证、消息传输过程中的按序接收、不丢失和加密传送。
而DTLS协议在UDP提供的socket之上实现了客户机与服务器双方的握手连接,并且在握手过程中通过使用PSK或ECC实现了加密,并且利用cookie验证机制和证书实现了通信双方的身份认证,并且用在报文段头部加上序号,缓存乱序到达的报文段和重传机制实现了可靠传送。
在握手完成后,通信双方就可以实现应用数据的安全加密和可靠传输
协议过程
第一步
客户端发送第一个报文段 Client Hello, 未携带 Cookie, SessionID 未生成,客户端携带了用于协商的算法集,DTLS 支持的 Version(1.0/1.2),服务端响应的报文段 Client Hello Verify 中加入 Cookie(32字节),协商 DTLS Version 返回给客户端。
第二步
客户端发送 Client Hello 报文段中加入服务端发送过来的 Cookie,添加了 Random,客户端携带了用于协商的算法集。
服务端验证 Cookie 是否合法,若是通过 Cookie 验证,继续进行握手连接;若验证失败,则拒绝建立连接;
- 返回 Cipher Suite,指明了即将采用的密钥算法集,比如 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384;
- 返回 Certificate (公钥证书);
- 返回 Server Key Exchange (ECDSA 数字签名);
- Server Hello Done(这只是一个简单的标志,告知客户端报文段已经发送结束);
第三步
做密钥的协商;
客户端收到 Server Hello Done,客户端计算产生 Client Key Exchange,不同于 Server Key Exchange,无 ECDSA 数字签名。。
client_key_exchange,合法性验证通过之后,客户端计算产生随机数字 Pre-master,并用证书公钥加密,发送给服务器;
change_cipher_spec,客户端通知服务器后续的通信都采用协商的通信密钥和加密算法进行加密通信;
encrypted_handshake_message,结合之前所有通信参数的 hash 值与其它相关信息生成一段数据,采用协商密钥 session secret 与算法进行加密,然后发送给服务器用于数据与握手验证;
这一步也代表客户端已经确认算法和密钥。 服务端也要确认算法和密钥。
第四步
采用计算出来的对称密钥,进行数据的加解密。
第五步
双方 CLOSE 操作
评论区