WebRTC 服务器(mediasoup)抛出 SSL 错误,但仅适用于 Firefox(?!)

WebRTC server (mediasoup) throws SSL error, but only for Firefox (?!)

我运行在没有防火墙的独立机器上安装流行的开源mediasoup WebRTC 服务器,安装了新的 SSL 证书,几乎没有其他东西 运行在机器(没有网络服务器,没有数据库服务器,什么都没有)。当我的视频聊天应用程序尝试通过此服务器将视频流式传输到使用 Firefox 的客户端时,mediasoup 发出 SSL 错误(下面第二行):

mediasoup:WARN:mediasoup-worker [id:gxzingwt#3] RTC::DtlsTransport::OnSslInfo() | received DTLS fatal alert: bad certificate +0ms
mediasoup:ERROR:mediasoup-worker [id:gxzingwt#3] RTC::DtlsTransport::CheckStatus() | OpenSSL error [desc:'SSL status: SSL_ERROR_SSL', error:'error:14102412:SSL routines:dtls1_read_bytes:sslv3 alert bad certificate'] +0ms
mediasoup:WARN:mediasoup-worker [id:gxzingwt#3] RTC::DtlsTransport::CheckStatus() | connection failed +1ms
mediasoup:WARN:mediasoup-worker [id:gxzingwt#3] RTC::DtlsTransport::Reset() | resetting DTLS transport +1ms
mediasoup:WARN:mediasoup-worker [id:gxzingwt#3] RTC::WebRtcTransport::OnDtlsFailed() | DTLS failed +0ms

奇怪的是,这只发生在 Firefox 浏览器上。对于 Safari Chrome 和 Safari iOS (phone/iPad),完全没有问题。如果我的视频聊天室中有 5 个人在广播,我可以打开这些人和 see/stream 视频,而其他浏览器没有任何问题。但是 Firefox(最新版本,开发者版和常规 Firefox)导致 mediasoup 抛出 SSL 错误,流无法解析并向用户显示视频。

mediasoup 运行ning 在端口 8443 上,我也在端口 443 上尝试过。我检查了调试日志,没有发现任何其他问题——就是这个 SSL 问题。

我想也许我的 Let's Encrypt 证书不好,所以我已经撤销、删除并重新颁发了该域的 SSL 证书。那里没有问题或任何奇怪的事情。

我已经 运行 openssl s_client -connect [my domain running mediasoup].com:8443 -showcerts 一切看起来都很棒,证书很好——格式与我的网络服务器机器上的有效证书相同的输出以及来自 as 的相同输出相匹配朋友的 WebRTC 服务器。我也在机器本身上尝试了 openssl s_client -host [my domain].com -port 8443 -cert /etc/letsencrypt/live/[my domain].com/cert.pem -key /etc/letsencrypt/live/[my domain].com/privkey.pem,一切都很好。所以我不认为这是证书。

因为只有 Firefox 有这些问题,我想 Firefox 可能以某种方式缓存了一个 old/invalid 证书,所以我删除并清理了 Firefox 的缓存,并查看了我的 Mac 的钥匙串访问应用程序查看 mediasoup 运行ning 所在的域是否有任何证书(没有)。

这是怎么回事?! ;-) 为什么 Firefox——而且只有 Firefox!——会导致 mediasoup 抛出此错误,并阻止我的 Firefox 用户使用视频聊天?再次说明:使用 Chrome、Safari、iPad/iPhone、一切正常。

(或者,我怎样才能让 mediasoup-worker 进程告诉我更多关于它不喜欢 SSL 证书的确切原因?)

(此外,为什么只有 Firefox 有问题?可能是存储在 Firefox 中的证书发送到 mediasoup 服务器以与其通信?我知道 WebRTC 协议很复杂并且具有很多谈判,也许这是其中的一部分......就像它可能指的是与服务器域上的证书不同的证书?)

mediasoup 论坛在这里:https://mediasoup.discourse.group

顺便说一句,正如 Philipp 所说,mediasoup "is not listening in port 8443 or 443"。那是 mediasoup-demo 项目的 WebSocket 服务器。 mediasoup 本身根本不监听 HTTP 或 WebSocket。

如果您不向 mediasoup.createWorker() 提供 TLS 证书,mediasoup 将为 DTLS 创建自己的随机证书。在 DTLS 中您会看到该错误。

顺便说一句,我在 OSX 中测试了最新的 Firefox 稳定版 (68.0.2) 和 Nightly (70.0a1 (2019-08-14)),我在 DTLS 中没有遇到任何 SSL 错误,老实说不知道。

PS:如果您可以提供更多信息(例如您使用的是哪个 mediasoup 版本),请在 "mediasoup-demo" 类别的 mediasoup 讨论组中打开一个问题。