openssl - WebRTC 服务器(mediasoup)抛出 SSL 错误,但仅适用于 Firefox(?!)
问题描述
我在一个独立的机器上运行流行的开源mediasoup WebRTC 服务器,没有防火墙,安装了新的 SSL 证书,并且机器上几乎没有运行其他任何东西(没有 Web 服务器,没有数据库服务器,什么都没有)。当我的视频聊天应用程序尝试通过此服务器将视频流式传输到使用 Firefox 的客户端时,mediasoup 发出 SSL 错误(下面的第 2 行):
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(手机/iPad),完全没有问题。如果我有 5 个人在我的视频聊天室中进行广播,我可以打开这些人并从其他浏览器观看/流式传输视频,而不会出现任何问题。但是 Firefox(最新版本,开发者版和常规 Firefox)导致 mediasoup 抛出 SSL 错误,并且流无法解析并将视频显示给用户。
mediasoup 在端口 8443 上运行,我也在端口 443 上尝试过。我检查了调试日志,找不到任何其他问题——就是这个 SSL 问题。
我想也许我的 Let's Encrypt 证书不好,所以我已经撤销、删除并重新颁发了域的 SSL 证书。那里没有问题或任何奇怪的东西。
我已经运行openssl s_client -connect [my domain running mediasoup].com:8443 -showcerts
了,一切看起来都很好,证书也很好——格式与我的 Web 服务器机器上的有效证书的输出相同,也与朋友的 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 以某种方式缓存了一个旧的/无效的证书,所以我删除并清理了 Firefox 的缓存,还查看了我的 Mac 的钥匙串访问应用程序,看看那里是否有该域的证书mediasoup 在哪里运行(没有)。
到底是怎么回事?!;-) 为什么 Firefox——而且只有 Firefox!——会导致 mediasoup 抛出这个错误,并阻止我的 Firefox 用户使用视频聊天?再次重申:使用 Chrome、Safari、iPad/iPhone,一切都可以完美运行。
(或者,我怎样才能让 mediasoup-worker 进程告诉我更多关于它为什么不喜欢 SSL 证书的信息?)
(另外,为什么只有 Firefox 有问题?它可能是存储在 Firefox 中的证书,它发送到 mediasoup 服务器与之交谈?我知道 WebRTC 协议很复杂并且有很多协商,也许这就是它的一部分......就像它可能指的是与服务器域上的证书不同的证书?)
解决方案
mediasoup 论坛在这里:https ://mediasoup.discourse.group
顺便说一句,正如 Philipp 所说,mediasoup“没有在端口 8443 或 443 上监听”。那是mediasoup-demo项目的 WebSocket 服务器。mediasoup 根本不监听 HTTP 或 WebSocket。
如果您不提供 TLS 证书,mediasoup.createWorker()
则 mediasoup 将为DTLS创建自己的随机证书。在 DTLS 中您会看到该错误。
顺便说一句,我已经在 OSX 中测试了最新的 Firefox stable (68.0.2) 和 Nightly (70.0a1 (2019-08-14)),我在 DTLS 中没有收到任何 SSL 错误,所以老实说不知道。
PS:如果您可以提供更多信息(例如您正在使用哪个 mediasoup 版本),请在 mediasoup Discourse Group 的“mediasoup-demo”类别中打开一个问题。
推荐阅读
- ios - Flutter登录Apple无法在iOS模拟器上运行(无限加载器)
- mysql - 仅当日期有效时才在 MySQL 中插入日期
- javascript - 了解 React JS 中的 .env 文件和环境变量
- django-rest-framework - 使用 postman 或 django-rest-framework 测试
- sql - SQL 语句的建议格式
- matlab - 在 Matlab 中用计数命名
- javascript - 如何等待函数内部的猫鼬承诺?
- heroku - 为什么 Heroku 会引发这个不寻常的错误?
- javascript - 在 javascript 中收听网页上的传出请求
- javascript - 无法在保管箱中获取访问令牌使用 javascript 获取请求