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

olmpazwi  于 2023-06-23  发布在  其他
关注(0)|答案(7)|浏览(413)

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

我谷歌了一下,发现了太多的想法,但没有一个对我有用:(
任何帮助将不胜感激。

qcbq4gxm

qcbq4gxm1#

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

hs1ihplo

hs1ihplo2#

如果是自签名证书,浏览器不会显示接受证书的对话框,如果它只在WebSocket中使用。您必须首先访问同一服务器上的正常页面以查看并接受证书警告,然后才能创建安全WebSocket。

1qczuiv0

1qczuiv03#

我通过ProxyPass解决了这个问题。我用Tornado创建了一个不安全的WebSocket服务器,并在一个特定的端口(如3232)上运行它:

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

然后我在Apache conf中编写了一个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。这不是一个确切的解决方案,主要是一个变通方案。但对我来说很好。

h79rfbju

h79rfbju4#

尝试在firefox中打开此url https://websocket.localhost/mypath/ws并首先接受证书。

eni9jsuy

eni9jsuy5#

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

0s7z1bwu

0s7z1bwu6#

我碰巧以错误的方式创建了我的自签名证书,留下了Basic Constraint -> Certificate Authority = Yes。
您可以通过在firefox中访问about:preferences#privacy来检查,然后单击查看证书...按钮。您将在服务器选项卡上看到您的网站/Web应用及其证书的列表。单击您的服务器,然后单击**查看...**按钮。
将打开一个新窗口/选项卡,其中包含证书的详细信息。向下滚动以找到“基本约束”部分,在那里您将看到您是否生成了声明自己为证书颁发机构(CA)的证书。如果是这样的话,您必须在没有该约束的情况下再次生成证书(CA=false)

11dmarpk

11dmarpk7#

我为这件事抓狂了好一阵子。根据不同的Web浏览器,我收到了各种各样的神秘错误消息,所有这些都让它听起来像是关于证书异常的事情。我已经在Firefox和Chrome中做了例外,

原来我在JavaScript中的子协议字符串中有一个错字!

纠正子协议字符串使一切都更好。有关WebSockets和使用子协议的更多信息:https://developer.mozilla.org/en-US/docs/Web/API/WebSocket

相关问题