TURN 上的 WebRTC 流量是不是端到端加密?
Posted
技术标签:
【中文标题】TURN 上的 WebRTC 流量是不是端到端加密?【英文标题】:Is WebRTC traffic over TURN end-to-end encrypted?TURN 上的 WebRTC 流量是否端到端加密? 【发布时间】:2014-04-15 13:35:31 【问题描述】:WebRTC 流量使用 DTLS 加密 - 好的。但是通过 TURN 服务器中继的流量呢?
我正在寻找一种可靠的资源来确认流量是真正端到端加密的(因为“端到端”有时可能意味着几件事)。所以我的意思是
并不是说在对等方和 TURN 服务器之间存在“端到端”加密。而是,
在对等点之间是端到端的 这样它就不会在 TURN 服务器上解密/重新加密 并且 TURN 服务器无法访问机密我还没有找到明确的答案。
【问题讨论】:
好问题!谢谢 【参考方案1】:看的地方是 TURN 提出的标准,RFC 5766。该标准提供了一种在客户端和对等方之间中继包含应用程序数据的 UDP 数据包的方法:
创建分配后,客户端可以将应用程序数据连同数据将发送到哪个对等方的指示一起发送到服务器,并且服务器会将此数据中继到适当的对等方。客户端在 TURN 消息中将应用程序数据发送到服务器;在服务器端,从 TURN 消息中提取数据并以 UDP 数据报的形式发送给对等方。在相反的方向上,对等点可以将 UDP 数据报中的应用程序数据发送到中继的传输地址进行分配;然后,服务器会将这些数据封装在 TURN 消息中,并将其连同指示哪个对等方发送数据的指示一起发送给客户端。
TURN 解析的最高层是 UDP 层。它不理解或修改应用程序数据层(在您的情况下是 WebRTC 协议)。标准说:
希望确保其数据不被更改或伪造的应用程序必须在应用程序级别对其数据进行完整性保护。
这意味着您可以完整地保护您的应用程序数据,并且 TURN 将在不修改的情况下转发它。您还可以查看 TURN 协议的详细信息(我不会在此重复),这表明它只是包装和转发应用程序数据。
最后,标准对窃听是这样说的:
TURN 中继的应用程序数据最好保密 由应用程序协议本身提供,因为运行 TURN over TLS 不保护服务器和服务器之间的应用程序数据 同行。如果应用程序数据的机密性很重要,那么 应用程序应加密或以其他方式保护其数据。为了 例如,对于实时媒体,机密性可以由 使用 SRTP。
此摘录中的建议是通过使用 WebRTC 使用的 DTLS-SRTP 等协议加密应用程序数据来保护机密性。
由于 TURN 不会解释或修改应用程序数据,因此它不会向 WebRTC 应用程序数据流量添加任何不使用 TURN 就不会存在的安全漏洞。 WebRTC 数据在 WebRTC 端点之间进行加密。
现在,没有人可以保证“TURN 服务器无法访问该机密”。流氓 TURN 服务器可以像其他任何可以拦截您的网络数据包的人一样轻松地尝试对您的连接进行中间人攻击。只有使用 TURN 中继并不会削弱 WebRTC 安全性,这是事实。
只要正确实施和使用 DTLS 并假设 DTLS 算法和密码是安全的,WebRTC 流量就应该得到端到端的保护。使用任何基于 SSL 的方案的一部分需要验证另一个端点的证书,就像 HTTPS。就像 HTTPS 一样,这将需要事先进行带外证书身份交换或使用受信任的第三方。就像 HTTPS 一样,如果证书没有得到正确验证,那么 MITM 攻击的大门就会打开(任何人,而不仅仅是 TURN 服务器)。
【讨论】:
这个答案肯定是朝着正确的方向发展的。很明显,加密必须在应用层完成,端到端加密才能工作。但是 1. 我不能 100% 确定,如果“TURN 解析的最高层是 UDP 层。”:code.google.com/p/rfc5766-turn-server/wiki/turnserver 中有 dtls 和 tls 选项。 2. 我不能 100% 确定 WebRTC 是否与 TURN 服务器或其他客户端执行 DTLS 的密钥交换。我在 WebRTC 规范中没有找到任何相关内容。 @ChrisLercher,TURN 协议本身可以通过 TLS 或 DTLS 来保护客户端和服务器之间的连接(RFC 5766 中允许使用 TLS;DTLS 是一个明显的增强)。这种加密封装了客户端和服务器之间的流量,并且位于应用层中的任何加密之上。在开源代码中,--no-tls
和 --no-dtls
选项的描述(定义在 mainrelay.c 中,用于 netengine.c 中)实际上说这适用于 client listeners,表示套接字用于 TURN 协议层。
@ChrisLercher,WebRTC 没有指定 DTLS 握手,因为这是 DTLS 的一部分。 DTLS 只是 TLS 的 UDP 化版本,因此可以保证端到端的加密。但就像 HTTPS 一样,它只有在您验证对等方的证书时才有效 - 否则,正如您所担心的那样,有人可以使用 MITM 攻击。而且,就像 HTTPS 一样,WebRTC 实现必须检查证书以确保安全。 W3C 草案第 8.3.5 节对此进行了介绍:等待所有 DTLS 连接建立并检查所有连接上的证书指纹是否与 IdP 提供的指纹匹配。
@ChrisLercher,请注意,有些实现不会执行证书检查,这需要事先进行带外证书交换或受信任的第三方身份服务器(同样,就像 HTTPS)。我相信 WebRTC 有其他提议的更改来解决这个问题。
有人能用2019年的知识和目前主流浏览器的实现来回答这个问题吗!?以上是关于TURN 上的 WebRTC 流量是不是端到端加密?的主要内容,如果未能解决你的问题,请参考以下文章