我们假设一个场景, A 与 B 通信,但此时 B 并不是真正的 B ,而是冒充的,这样 A 与 B 通信时,冒充的 B 就获得了 A 的重要信息。其实这种情况更多发生在会议系统或在线教育的小班课中,此时会议中有多人进行互动,如果黑客进入了会议中,他只需听别人说话,自己不发言,这样就将关键的信息窃取走了。所以现在的问题又来了,我们该如何辨别对方的身份是否合法呢?
了解https协议的人都知道,https是通过非对称加密、数字签名和数字证书来确保数据传输的安全,这其实是SSL协议的一部分,在webrtc中也会采用类似SSL的机制来保证数据安全。这就是了DTLS。
我们先来看一下,webrtc是如何识别双方身份的。
它首先通过信令服务器交换 SDP,SDP 信息中包括了以下几个重要信息:
...
a=ice-ufrag:khLS
a=ice-pwd:cxLzteJaJBou3DspNaPsJhlQ
a=fingerprint:sha-256 FA:14:42:3B:C7:97:1B:E8:AE:0C2:71:03:05:05:16:8F:B9:C7:98:E9:60:43:
...
SDP 交换完成后,A 与 B 都获取到了对方的 ice-ufrag、ice-pwd 和 fingerprint 信息,有了这些信息后,就可验证对方是否是一个合法用户了。
其中, ice-ufrag 和 ice-pwd 是用户名和密码。当 A 与 B 建立连接时,A 每次发送数据到B,都要带着它的用户名和密码过来,此时 B 端就可以通过验证 A 带来的用户名和密码与 SDP 中的用户名和密码是否一致的,来判断 A 是否是一个合法用户了。
除此之外,fingerprint也是验证合法性的关键一步,它是存放公钥证书的指纹(或叫信息摘要),在通过 ice-ufrag 和 ice-pwd 验证用户的合法性之余,还要对它发送的证书做验证,看看证书在传输的过程中是否被窜改了。
从这张图中你可以看到, A 与 B 在传输数据之前,需要经历如下几个步骤。
- 首先通过信令服务器交换 SDP 信息,也就是进行媒体协商。在 SDP 中记录了用户的用户名、密码和指纹,有了这些信息就可以对用户的身份进行确认了。
- 然后就是双方通过 STUNTURN 协议获得自己的host、srflx 和 relay,交换candidate,这样双方才能建立连接。但是在语言视频直播中,客户端B一般是流媒体服务器,所以客户端A发一个STUN request ,服务端B响应一个STUN response,双方就可以建立连接了,但是发送STUN 消息的时候要带上用户名和密码。如果 STUN 消息中的用户名和密码与交换的 SDP 中的用户名和密码一致,则说明是合法用户。
- A、B建立连接后,则需要进行 DTLS 协商(协商过程下面会讲),交换公钥证书并协商密码相关的信息。同时还要通过 fingerprint 对证书进行验证,确认其没有在传输中被窜改。
- 最后,再使用协商后的密码信息和公钥对数据进行加密,开始传输音视频数据。
以上就是 WebRTC 保证数据安全的整套机制。
WebRTC 是通过使用 DTLS、SRTP 等几个协议的结合来达到数据安全的,那接下来我们就来分别看一下这几个协议是如何实现的。
DTLS协议
说到网络上的数据安全你可能首先想到的是 HTTPS, HTTPS 可以简单理解为“HTTP 协议 + SSL数据加密”,当然实际上它要复杂得多。HTTPS 的底层最初是使用 SSL协议对数据加密。当 SSL 更新到 3.0 时,IETF 对 SSL 3.0 进行了标准化,并增加了一些新的功能,不过基本与 SSL 3.0 没什么区别,标准化后的 SSL 更名为 TLS 1.0,所以可以说 TLS 1.0 就是 SSL 的 3.1 版本。
由于 TLS 底层是基于 TCP 协议的,而 WebRTC 音视频数据的传输主要基于 UDP 协议,因此 WebRTC 对数据的保护无法直接使用 TLS 协议。但 TLS 协议在数据安全方面做得确实非常完善,所以人们就想到是否可以将 TLS 协议移植到 UDP 协议上呢? 因此 DTLS 就应运而生了。
所以你可以认为DTLS 就是运行在 UDP 协议之上的简化版本的 TLS,它使用的安全机制与 TLS 几乎一模一样。
在 WebRTC 中为了更有效地保护音视频数据,所以需要使用 DTLS 协议交换公钥证书,并确认使用的密码算法,这个过程在 DTLS 协议中称为握手协议。
DTLS 的握手过程如下:
- 首先 DTLS 协议采用 C/S 模式进行通信,其中发起请求的一端为客户端,接收请求的为服务端。
- 客户端向服务端发送 ClientHello 消息,服务端收到请求后,回 ServerHello 消息,并将自己的证书发送给客户端,同时请求客户端证书。
- 客户端收到证书后,将自己的证书发给服务端,并让服务端确认加密算法。
- 服务端确认加密算法后,发送 Finished 消息,至此握手结束。
DTLS解决的问题
- 交换密钥
- 约定使用的加密算法
(DTLS不解决加密、解密的问题 , 加密解密的问题是通过 SRTP/SRTCP 协议解决的)
SRTP/SRTCP 协议
RTP/RTCP 协议并没有对它的负载数据进行任何保护。因此,如果你通过抓包工具,如 Wireshark,将音视频数据抓取到后,通过该工具就可以直接将音视频流播放出来,这是非常恐怖的事情。
在 WebRTC 中,为了防止这类事情发生,没有直接使用 RTP/RTCP 协议,而是使用了 SRTP/SRTCP 协议 ,即安全的 RTP/RTCP 协议。
WebRTC 使用了非常有名的 libsrtp 库将原来的 RTP/RTCP 协议数据转换成 SRTP/SRTCP 协议数据。
SRTP要解决的问题
- 对数据加密,保证数据安全
- 保证数据完整性