概述
DTLS(Datagram Transport Layer Security) 提供了 UDP 传输场景下的安全机制,能防止窃听、篡改、冒充等问题。
在 WebRTC中使用 DTLS 的地方包括两部分:
Datachannel 数据通道
在 Datachannel 数据通道中,WebRTC 完全使用 DTLS 来进行协商和加解密
MediaChannel 媒体通道
在媒体通道中 WebRTC 使用 SRTP 来进行数据的加解密,DTLS 的作用仅仅是用来做密钥交换,RTP/RTCP 的数据为了与历史设备兼容性的考虑,完全通过 SRTP 来实现。
DTLS 的作用是给数据通道数据加密(保证数据安全性)、增加链路证书校验机制(防止网络攻击)。与 TLS over TCP 不同,UDP层没有对数据报文的乱序、丢包做处理,会导致链路证书校验协商无法保证。所以:
DTLS 在创建连接时的握手消息里面,需要增加可靠性传输机制。
由于 UDP 对数据的实时性要求比较高,所以链路建立稳定后,传输应用数据时,没有提供数据可靠性传输机制,需要 SCTP 协议或者应用层保证。
DTLS 可以参考的 RFC 文档:
rfc4347
rfc5763
DTLS 的交互流程大概如下:
Peer-1 Peer-2
------ ------
ClientHello --------> Flight 1
<------- HelloVerifyRequest Flight 2
ClientHello --------> Flight 3
ServerHello \
Certificate* \
ServerKeyExchange* Flight 4
CertificateRequest* /
<-------- ServerHelloDone /
Certificate* \
ClientKeyExchange \
CertificateVerify* Flight 5
[ChangeCipherSpec] /
Finished --------> /
[ChangeCipherSpec] \ Flight 6
<-------- Finished /
Figure 1. Message flights for full handshake
下图为 WebRTC 媒体通过建立过程的简单描述,可以看出 DTLS 在整个协商过程中与其他流程的时序关系。
WebRTC 中 DTLS 参数
WebRTC 中的 DTLS 参数需要通过 SDP 信息来设置和传递,而且只需要两种 a line 表示:
a=setup
a=fingerprint
a=setup 表示 DTLS 的协商过程中角色,有三个可能值:
a=setup:actpass 既可以是 client 角色,也可以是 server 角色
a=setup:active client 角色
a=setup:passive server 角色
根据 RFC5763,SDP请求的 a=setup 属性必须是 actpass,由应答方决定谁是 DTLS client,谁是 DTLS server。
a=fingerprint 的内容是证书的摘要签名,用于验证证书的有效性,防止冒充。