安全的WebSocket(wss://)在Firefox浏览器上无法使用。

7
我有一个能够工作的非安全WebSocket应用程序。但是我的网站使用https,因此我需要一个安全的WebSocket连接,以避免Firefox抱怨连接不安全的事实。
我正在使用PhP 5.2.9的php-websocket-server作为我的WebSocket服务器,因此当我使用WebSocket Secure时,我无法使用openssl_decrypt函数解密数据包。
这就是为什么我使用stunnel来解密使用wss发送的客户端数据包的原因,我将客户端WebSocket绑定到12345端口和服务器WebSocket绑定到54321端口,然后在服务器模式下添加了一个stunnel:
[wsServer]
accept  = 12345
connect = 192.168.1.227:54321

使用这个配置,我的应用可以在Chrome上通过https+wss正常工作。但是在Firefox中握手时会出现问题,似乎header中缺少Sec-WebSocket-Version和Sec-WebSocket-Key。我不明白为什么它可以通过http+ws在Firefox上工作。
提前感谢您的帮助。
编辑:我添加了一个证书例外的端口12345,现在握手进行得很好,因为我认为Firefox现在有了Sec-WebSocket-Key。
这里是使用Firefox的工作头请求(比Chrome请求更大):
GET / HTTP/1.1
Host: 192.168.1.227:12345
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/;q=0.8
Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive, Upgrade
Sec-WebSocket-Version: 13
Origin: https://192.168.1.227
Sec-WebSocket-Protocol: HyBi-00
Sec-WebSocket-Key: 65nHN33M6drIPjQHcGK8pA==
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket

如果你能展示工作和不工作情况下双向的实际头部/握手信息,我很可能能够快速确定问题所在。 - kanaka
1个回答

12
如果您使用自签名证书在本地工作,必须在运行在端口443上的https://和运行在端口12345上的wss://两个服务器上均通过Firefox批准它。
我认为您的浏览器不允许安全的WebSocket连接,这就是为什么一些头文件丢失的原因。
[根据@Faisal的评论更新,因为这真的很重要]
答案是正确的,但有点不清楚。 当您尝试打开wss比如wss://mysite.com:12345时,Firefox会不断给您错误,直到您打开一个单独的Firefox选项卡并尝试点击URL [https]://mysite.com:12345并确认安全性异常(就像您通常对于任何基于https的连接在Firefox上做的那样)。 这真的很奇怪,只会在Firefox中发生。

1
当我查看控制台时,WebSocket请求被中止了,我右键单击它并在新选项卡中打开了请求。新选项卡中的URL是https://192.168.1.227:12345/,Firefox要求我接受端口12345的证书。第一次尝试时,Firefox要求我接受https端口但不接受12345端口的证书。 - Quentin D
4
答案是正确的,但有点不清楚。如果你尝试使用wss://mysite.com:12345打开WebSocket Secure (wss),Firefox会一直给出错误提示,直到你在一个单独的Firefox选项卡中打开[https]://mysite.com:12345并确认安全异常(就像你通常为任何基于https的连接在Firefox上做的那样)。这真的很奇怪,而且只会在Firefox中发生。 - Faisal Mq

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