【问题标题】:How to debug Safari silently failing to connect to a secure WebSocket如何静默调试 Safari 无法连接到安全的 WebSocket
【发布时间】:2010-10-25 11:21:49
【问题描述】:

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

Chrome 在安全和非安全主机上都能正常工作。

我将如何调试或修复此问题? Google 的信息非常匮乏。

以下是运行 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 时它不会显示。

【问题讨论】:

    标签: javascript ssl safari websocket


    【解决方案1】:

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

    【讨论】:

    • 啊,是的,那是我记得处理过的另一件事。但是,我很惊讶在这种情况下您没有从您的 WebSockets 服务器获得任何反馈。
    • 好吧,它甚至没有收到请求,因为 Safari 在握手后立即关闭了连接。它从未到达 WebSockets 服务器。
    • 有人能给出更明确的步骤吗?我在这里没有真正得到解决方案!
    【解决方案2】:

    在我看到这个的地方,这意味着证书有问题(过期、域不正确等)。尝试从 Safari 直接连接到 WebSockets 服务器,即https://wss_server:wss_port/。 Safari 应该会以这种方式为您提供更好的错误消息。

    当我在开发 wsproxy 作为noVNC(HTML5 VNC 客户端)的一部分时遇到这个问题时,结果发现我使用的是服务器 IP,但证书是为主机名签名的。

    【讨论】:

    • 证书很好,我们可以通过其他方式连接。这是一个 SSL 配置问题,如下所示。
    猜你喜欢
    • 2019-07-17
    • 2015-05-25
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 2014-07-09
    • 2014-04-09
    • 2014-10-27
    相关资源
    最近更新 更多