Javascript 无法在Firefox上建立Websocket安全连接

Javascript 无法在Firefox上建立Websocket安全连接,javascript,python,firefox,websocket,tornado,Javascript,Python,Firefox,Websocket,Tornado,我被Firefox绊倒了。我无法让Websocket在上面工作。我使用Tornado Websocket,并通过以下代码对其进行了初始化: app = Application([(r'/mypath/ws', WSHandler)]) http_server = HTTPServer(app, ssl_options={ "certfile": "~/certs/websocket.crt", "keyfile": "~/certs

我被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");
var WS = new WebSocket("wss://websocket.localhost:81/ws/")
这段代码在Chrome上运行良好,同时我自己创建了证书,并在HTTPS下运行该页面。但Firefox一直说:

Firefox can't establish a connection to the server at wss://websocket.localhost/mypath/ws.
我在谷歌上搜索,找到了太多的想法,但没有一个对我有用:(


任何帮助都将不胜感激。

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

我通过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/mypath/ws");
var WS = new WebSocket("wss://websocket.localhost:81/ws/")

在这种情况下,我可以使用https在安全连接上创建一个连接,我的端口是81,我的proxypass将任何Websocket请求重定向到本地侦听的端口3232。这不是一个类似于解决方法的精确解决方案。但对我来说效果很好。

我已经解决了这个问题,在Firefox的高级首选项中添加了一个证书异常

尝试在firefox中打开此url,并首先接受证书。

我对该url发火了一段时间。根据不同的web浏览器,我收到了各种神秘的错误消息,这一切听起来都像是证书异常。我已经在firefox和Chrome中出现了异常

结果是我的Javascript子协议字符串中有一个输入错误!

更正子协议字符串使一切变得更好。
有关websocket和使用子协议的详细信息:

如果是自签名证书,浏览器将不会显示对话框以接受仅在websocket中使用的证书。
您必须首先访问请求的url以查看并接受证书警告,然后才能创建安全websocket。

例如,如果您的websocket url为:
wss://localhost:44300/OpenWebSocket
然后访问:


并接受证书警告

证书是您自己创建的…您是否将其添加到浏览器的受信任证书列表中?我不应该手动将自己的证书添加到浏览器中,因为我的客户端不会这样做。我必须找到一个永久解决方案。FatihKaratana试试konghou说的,如果有效,您可能需要购买证书来自受信任的颁发者。即使我在连接之前访问主机(本地主机),它仍然不起作用。您可能会通过这种方式解决问题,但我没有机会强迫我的用户这样做:(这是我的关键点。这就是我找到解决方法的原因。