无法在Firefox中建立Websocket安全连接

18 投票
7 回答
56712 浏览
提问于 2025-04-18 07:10

我在使用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.

我在网上搜索了很多相关的内容,但没有一个对我有用 :(

任何帮助都非常感谢。

7 个回答

1

我之前遇到过一个问题,就是我创建自签名证书的时候,设置错了,把基本约束的“证书颁发机构”选项设成了“是”。

你可以通过在Firefox浏览器中访问 about:preferences#privacy 来检查这个问题,然后点击查看证书...按钮。这样你就能看到你的网站或网络应用以及它们的证书,点击服务器标签。

在这里,找到你的服务器,点击查看...按钮。

这时会打开一个新窗口或标签,显示证书的详细信息。向下滚动,找到“基本约束”这一部分,你就能看到你是否把自己声明为证书颁发机构(CA)。如果是这样的话,你需要重新生成证书,确保把这个选项设为“否”(CA=false)。

1

首先,试着在Firefox浏览器中打开这个网址 https://websocket.localhost/mypath/ws,然后先接受证书。

11

如果是自签名证书,浏览器在只用它来做websocket的时候不会弹出接受证书的对话框。你必须先访问同一个服务器上的一个普通网页,才能看到并接受证书的警告,然后才能创建安全的websocket连接。

25

如果你使用的是自签名证书,浏览器在只用它来建立websocket连接时不会弹出接受证书的对话框。
你需要先访问一下请求的链接,才能看到并接受证书的警告,然后才能创建安全的websocket连接。

比如说,如果你的websocket链接是:
wss://localhost:44300/OpenWebSocket
那么你需要先访问:
https://localhost:44300/OpenWebSocket
并接受证书的警告。

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端口。这并不是一个完美的解决方案,更像是一种变通方法。但对我来说,这样用得很好。

撰写回答