无法在Firefox中建立Websocket安全连接
我在使用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 个回答
我之前遇到过一个问题,就是我创建自签名证书的时候,设置错了,把基本约束的“证书颁发机构”选项设成了“是”。
你可以通过在Firefox浏览器中访问 about:preferences#privacy
来检查这个问题,然后点击查看证书...按钮。这样你就能看到你的网站或网络应用以及它们的证书,点击服务器标签。
在这里,找到你的服务器,点击查看...按钮。
这时会打开一个新窗口或标签,显示证书的详细信息。向下滚动,找到“基本约束”这一部分,你就能看到你是否把自己声明为证书颁发机构(CA)。如果是这样的话,你需要重新生成证书,确保把这个选项设为“否”(CA=false)。
首先,试着在Firefox浏览器中打开这个网址 https://websocket.localhost/mypath/ws,然后先接受证书。
如果是自签名证书,浏览器在只用它来做websocket的时候不会弹出接受证书的对话框。你必须先访问同一个服务器上的一个普通网页,才能看到并接受证书的警告,然后才能创建安全的websocket连接。
如果你使用的是自签名证书,浏览器在只用它来建立websocket连接时不会弹出接受证书的对话框。
你需要先访问一下请求的链接,才能看到并接受证书的警告,然后才能创建安全的websocket连接。
比如说,如果你的websocket链接是:
wss://localhost:44300/OpenWebSocket
那么你需要先访问:
https://localhost:44300/OpenWebSocket
并接受证书的警告。
我通过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端口。这并不是一个完美的解决方案,更像是一种变通方法。但对我来说,这样用得很好。