首页 文章

如何调试Safari静默无法连接到安全的WebSocket

提问于
浏览
9

在做 new WebSocket('ws://server/'); Safari连接正常时,但是当使用 new WebSocket('wss://server/'); 时它完全失败(返回一个 null 对象) . 更糟糕的是,它无声地失败 - 在回溯(自定义Eventlet Web服务器)或Safari中的错误控制台中没有错误 .

Chrome可与安全主机和非安全主机配合使用 .

我该如何调试或修复此问题?谷歌信息非常缺乏 .

这是从运行OpenSSL代替WebSockets服务器并查看会发生什么的一些追溯 . 首先,这是Chrome的(可以正常工作)调试输出:

Using default temp DH parameters
Using default temp ECDH parameters
ACCEPT
SSL_accept:before/accept initialization
SSL_accept:SSLv3 read client hello A
SSL_accept:SSLv3 write server hello A
SSL_accept:SSLv3 write certificate A
SSL_accept:SSLv3 write key exchange A
SSL_accept:SSLv3 write server done A
SSL_accept:SSLv3 flush data
SSL_accept:SSLv3 read client key exchange A
SSL_accept:SSLv3 read finished A
SSL_accept:unknown state
SSL_accept:SSLv3 write change cipher spec A
SSL_accept:SSLv3 write finished A
SSL_accept:SSLv3 flush data
-----BEGIN SSL SESSION PARAMETERS-----
GIBBERISH HERE
-----END SSL SESSION PARAMETERS-----
Shared ciphers:CIPHERS_HERE
CIPHER is REDACTED
Secure Renegotiation IS supported
GET / HTTP/1.1
Upgrade: WebSocket
Connection: Upgrade
Host: live.redacted.com:8443
Origin: http://redacted.com
Sec-WebSocket-Key1: 1 [ B l wA 3 e60   d9[  n0!>8384
Sec-WebSocket-Key2: 2 5  1  7p 17 64 3 9
Cookie: __key=value

这是Safari的(不起作用):

ACCEPT
SSL_accept:before/accept initialization
SSL_accept:SSLv3 read client hello A
SSL_accept:SSLv3 write server hello A
SSL_accept:SSLv3 write certificate A
SSL_accept:SSLv3 write server done A
SSL_accept:SSLv3 flush data
SSL_accept:failed in SSLv3 read client certificate A
ERROR
shutting down SSL
CONNECTION CLOSED

所以我认为Safari的证书存在问题 - 但是在使用常规HTTP时它没有显示出来 .

2 回答

  • 1

    Sysadmin摆弄已经发现了一个修复:默认情况下将OpenSSL设置为 SSLv3 会杀死Safari,但让它选择自己的SSL版本( all )可以正常工作 .

  • 3

    我已经看到这个,这意味着证书有问题(过期,不正确的域名等) . 尝试从Safari直接连接到WebSockets服务器,即 https://wss_server:wss_port/ . Safari应该会给你一个更好的错误信息 .

    当我在开发wsproxy作为noVNC(HTML5 VNC客户端)的一部分时出现此问题时,我发现我使用的是服务器的IP,但证书已签名为主机名 .

相关问题