WebRTC是否需要使用TURN服务器的“长期凭据”身份validation机制?

我打算在Coturn上为WebRTC应用运行我自己的TURN服务 – https://code.google.com/p/coturn/ 。 手册中提到了有关authentication和凭证的内容:

... -a, --lt-cred-mech Use long-term credentials mechanism (this one you need for WebRTC usage). This option can be used with either flat file user database or PostgreSQL DB or MySQL DB or MongoDB or Redis for user keys storage. ... 

此客户端代码示例还build议TURN需要凭据:

 // use google's ice servers var iceServers = [ { url: 'stun:stun.l.google.com:19302' } // { url: 'turn:192.158.29.39:3478?transport=udp', // credential: 'JZEOEt2V3Qb0y27GRntt2u2PAYA=', // username: '28224511:1379330808' // }, // { url: 'turn:192.158.29.39:3478?transport=tcp', // credential: 'JZEOEt2V3Qb0y27GRntt2u2PAYA=', // username: '28224511:1379330808' // } ]; 
  • 他们总是需要吗? (Coturn可以在没有任何authentication机制的情况下运行,但是从手册页不清楚WebRTC是否严格要求工作)
  • 如果需要,我可以创build一组凭据并将其用于所有客户端吗? (客户端代码示例显然只是为了演示,但似乎表明您可能将凭据硬编码到客户端代码中。如果这不可行/可推荐,那么推荐的方式是将适当的凭据传递给客户端代码?)

经过testing,似乎传递证书是需要客户端代码工作(否则在控制台中出现错误)。

在Coturn中保留“no-auth”选项(或者留下lt-cred-mech和st-cred-mech注释),但仍然在应用程序JS中传递证书也不起作用,因为TURN消息以某种方式被签名密码凭证。 也许Coturn不希望客户端发送validation细节,如果它运行在没有validation模式,所以它不知道如何解释消息。

打开lt-cred-mech并将用户名和密码硬编码到Coturnconfiguration文件和应用程序的JS中似乎都有效。 在Coturnconfiguration文件中注释了“静态用户”条目 – 使用明文密码格式而不是密钥格式。

Coturnconfiguration(这是我得到它的整个configuration文件):

 fingerprint lt-cred-mech #single static user details for long-term authentication: user=username1:password1 #your domain here: realm=mydomain.com 

ICE服务器列表从Web应用程序JS:

 var iceServers = [ { url: 'turn:123.234.123.23:3478', //your TURN server address here credential: 'password1', //actual hardcoded value username: 'username1' //actual hardcoded value } ]; 

很明显,这不会为TURN服务器提供实际的安全保护,因为任何人都可以看到证书 (所以任何人都可以使用带宽和处理器时间作为中继)。

综上所述:

  • 是的,WebRTC需要长期authentication才能使用TURN。
  • 是的,似乎你可以硬编码一个单一的一套凭据供大家使用 – coturn并不会困扰,两个客户端同时获得相同的凭据分配。
  • 一个可能的解决scheme是适当的安全性,最简单的方法就是使用TURN REST API 。