无法在Firefox上建立WebSocket安全连接

17
我在使用Firefox时遇到了问题。无法让WebSocket在其中工作。我使用Tornado WebSocket,并通过以下代码进行初始化:
app = Application([(r'/mypath/ws', WSHandler)])
http_server = HTTPServer(app, ssl_options={
                "certfile": "~/certs/websocket.crt",
                "keyfile": "~/certs/websocket.key"
            })
http_server.listen("443")

我在Javascript端这样初始化它:
var WS = new WebSocket("wss://websocket.localhost/mypath/ws");

这段代码在Chrome上运行良好,同时,我自己创建了证书并在HTTPS下运行页面。但是Firefox一直提示说:
Firefox can't establish a connection to the server at wss://websocket.localhost/mypath/ws.

我谷歌了一下,发现了很多想法,但是没有一个对我有用 :(
非常感谢任何帮助。

1
你自己创建了证书... 你是否将其添加到浏览器的受信任证书列表中? - konghou
1
我不应该手动将自己的证书添加到浏览器中,因为我的客户不会这样做。我必须找到一个永久性的解决方案。 - fth
2
FatihKaratana,尝试一下konghou所说的,如果可以的话,你可能需要从可信任的颁发机构购买证书。 - Javier Mr
7个回答

23
如果是自签名证书,浏览器在websocket中使用时不会显示接受证书的对话框。 您必须先访问请求的URL以查看和接受证书警告,然后才能创建安全的websocket。 例如,如果您的websocket URL 是: wss://localhost:44300/OpenWebSocket 那么请访问: https://localhost:44300/OpenWebSocket 并接受证书警告。

这应该是被接受的答案,因为它详细解释了如何解决。 - Mat Lipe
虽然应该作为对引用回答的编辑提出。 - dbreaux

11
如果是自签名证书,浏览器在仅用于websocket时不会显示接受证书的对话框。您必须先访问同一服务器上的普通页面以查看和接受证书警告,然后才能创建安全的websocket连接。

1
即使我在连接之前访问主机(localhost),它仍然无法正常工作。https://bugzilla.mozilla.org/show_bug.cgi?id=1187666 - B T

3

我通过 ProxyPass 解决了我的问题。我使用 Tornado 创建了一个非安全的 Websocket 服务器,并将其运行在特定的端口,例如3232:

app = Application([(r'/ws/', WSHandler)])
ws_server = HTTPServer(app)
ws_server.listen("3232")

我在Apache配置文件中编写了一个proxypass,并使用mod_proxy_wstunnel:

ProxyPass /ws/ ws://127.0.0.1:3232/ws/
ProxyPassReverse /ws/ ws://127.0.0.1:3232/ws/

我在前端创建了一个Websocket客户端,代码如下:

var WS = new WebSocket("wss://websocket.localhost:81/ws/")

在这种情况下,我可以使用https创建一个安全连接,我的端口是81,我的proxypass将任何Websocket请求重定向到本地监听的端口3232。这不是一个确切的解决方案,更像是一种解决方法。但对我来说,它运行得很好。

1

1

我曾经以错误的方式创建了自签名证书,将基本约束 -> 证书颁发机构 = 是。

您可以通过在Firefox中访问about:preferences#privacy,然后单击查看证书...按钮来检查。您将在服务器选项卡上看到您的网站/ Web应用程序及其证书列表。单击您的服务器,然后单击查看...按钮。

一个新的窗口/选项卡将打开,显示证书的详细信息。向下滚动以找到“基本约束”部分,您将看到是否将自己声明为证书颁发机构(CA)生成该证书。如果是,则必须再次生成您的证书,而不使用该约束(CA=false)。


完成这些操作后,我的Web应用程序可以在HTTPS下正常运行,并且我的WebSocket服务器使用WSS://而无需任何代理或其他技巧。 - jgarcias

0

我已经通过在Firefox的高级选项中添加证书异常来解决了这个问题。


2
你可能可以通过那种方式解决问题,但我没有办法强迫我的用户这样做 :( 这对我来说是关键。这就是为什么我找到了一种解决方法的原因。 - fth

-1
我为此问题苦恼了一段时间。不同的网络浏览器会出现各种加密错误信息,让人感到困惑,似乎都与证书异常有关。我已经在Firefox和Chrome中添加了例外情况,
结果发现我的Javascript子协议字符串中有一个拼写错误!
更正子协议字符串后,一切都变得更好了。 有关WebSockets和使用子协议的更多信息:https://developer.mozilla.org/en-US/docs/Web/API/WebSocket

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接