WebRTC DTLS 分析

0x00 概述

DTLS(Datagram Transport Layer Security) 提供了 UDP 传输场景下的安全机制,能防止窃听、篡改、冒充等问题。在 WebRTC中使用 DTLS 的地方包括两部分:

  • Datachannel 数据通道。在Datachannel数据通道中,WebRTC完全使用DTLS来进行协商和加解密
  • MediaChannel 媒体通道。在媒体通道中 WebRTC 使用 SRTP 来进行数据的加解密,DTLS 的作用仅仅是用来做密钥交换,RTP/RTCP 的数据为了与历史设备兼容性的考虑,完全通过 SRTP 来实现。

DTLS的作用是给数据通道数据加密(保证数据安全性)、增加链路证书校验机制(防止网络攻击)。与 TLS over TCP 不同,UDP层没有对数据报文的乱序、丢包做处理,会导致链路证书校验协商无法保证。所以:

  1. DTLS在创建连接时的握手消息里面,需要增加可靠性传输机制。
  2. 由于 UDP 对数据的实时性要求比较高,所以链路建立稳定后,传输应用数据时,没有提供数据可靠性传输机制,需要 SCTP 协议或者应用层保证。

DTLS 可以参考的 RFC 文档:

  • https://tools.ietf.org/html/rfc4347
  • https://tools.ietf.org/html/rfc5763

DTLS 的交互流程大概如下:

    Client                                          Server
    ------                                          ------

    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 分析_第1张图片

0x01 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 的内容是证书的摘要签名,用于验证证书的有效性,防止冒充。


参考文档

  1. WebRTC安全性的研究
  2. WebRTC使用SDES代替DTLS协商

你可能感兴趣的:(RTC)