7

我打算为带有 coturn 的 WebRTC 应用程序运行我自己的 TURN 服务 - https://code.google.com/p/coturn/。该手册对身份验证和凭据进行了说明:

   ...

   -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.

   ...

此客户端代码示例还建议 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 可以在没有任何身份验证机制的情况下运行,但从手册页中不清楚它是否是WebRTC 工作的严格要求)
  • 如果需要,我可以只创建一组凭据并将其用于所有客户端吗?(客户端代码示例显然只是为了演示,但它似乎表明您可以将凭据硬编码到客户端代码中。如果这是不可能/推荐的,那么将适当的凭据传递给客户端的推荐方法是什么?客户端代码?)
4

1 回答 1

15

测试后,客户端代码似乎需要传递凭据才能工作(否则您会在控制台中收到错误消息)。

在 Coturn 中启用“no-auth”选项(或同时保留 lt-cred-mech 和 st-cred-mech 注释)但仍然在应用程序 JS 中传递凭据也不起作用,因为 TURN 消息以某种方式使用签名密码凭证。如果 Coturn 在 no-auth 模式下运行,它可能不期望客户端发送身份验证详细信息,因此它不知道如何解释消息。

解决方案

打开 lt-cred-mech 并将用户名和密码硬编码到 Coturn 配置文件和应用程序的 JS 中,似乎可行。Coturn 配置文件中有注释掉的“静态用户”条目——使用纯密码格式而不是密钥格式。

Coturn 配置(这是我使用的整个配置文件):

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

来自网络应用 JS 的 ICE 服务器列表:

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 需要长期身份验证才能使用 TURN。
  • 是的,您似乎可以硬编码一组凭据供所有人使用——coturn 并不担心两个客户端同时使用相同的凭据获得分配。
  • Coturn 支持的TURN REST API是一种以最少麻烦获得适当安全性的可能解决方案。
于 2014-09-29T23:55:50.733 回答