【问题标题】:Cannot create WSS connection with Chrome, other browser work无法与 Chrome 建立 WSS 连接,其他浏览器工作
【发布时间】:2020-07-11 16:58:57
【问题描述】:

近两年来,Google Chrome 不再支持 SSL over websocket。 现在我不知道他们真正的问题是什么,除了我听说他们通过 SSL 重写了他们的 WS 协议。而且我正在使用 IO::Socket::SSL 我想知道你们是否真的知道它。我的示例站点是一个 irc 机器人,它通过 WSS 上的 javascript 连接从 HTTPS 主机运行。 https://lichtsnel.nl.

它确实工作了很多年,但由于谷歌显然改变了他们的程序,Chrome 是唯一一个仍然无法工作的浏览器。我想知道你们是否注意到了这一点。我已经使用 IO::Socket::SSL 为与 SSL 相关的任何内容编写了一个客户端/服务器库。它通过 HTTPS 完美运行,但不知何故,WSS 发生了一些变化。他们并没有解决这个问题。虽然他们可能会将新标准强制用于 HTTPS 层。如果没有工作的 WSS 层,chrome 就变得毫无用处了。我不得不退回到 http/ws。剩下的功能少了很多。

不确定这些模块的更新情况如何,我最近可以更新,但还是很幸运,如果你有任何关于他们协议更改的信息。所以我发邮件看看我们是否可以期待更新让 chrome 再次工作。

致以诚挚的问候, 爱彼迎 多梅罗。

这是 perl 中的服务器端代码:

# SSL
my $sslerr=0;
if ($self->{ssl}) {
  IO::Socket::SSL->start_SSL($client,
    SSL_server => 1,
    SSL_verify_mode => SSL_VERIFY_PEER,
    SSL_cert_file => $self->{sslcert},
    SSL_key_file => $self->{sslkey},
    SSL_ca_file => $self->{sslca},
    Listen => 128
  ) or $sslerr=1;
  if ($sslerr) { print STDOUT prtm(),"Failed to ssl handshake: $SSL_ERROR\n"; close($client) }
}

并且服务器只记录以下内容:

ssl 握手失败:SSL 接受尝试失败

【问题讨论】:

  • 我不太了解您对问题的描述 - 基本上我所了解的是您认为 Google 破坏了某些东西,但我不清楚细节。您的代码片段也不足以让我重现您遇到的问题,基本上您提供的只是一个需要(可选)客户端证书的 TLS 侦听器。目前尚不清楚什么客户端代码正在访问此服务器。如果您期望得到有用的答案,则可能需要更清楚地描述问题以及重现问题的方法。
  • 客户端只不过是标准的 javascript websocket 客户端,在 https 主机上打开。我可以给你我完整的服务器模块。看看服务器说什么和做什么。但基本上我的代码示例是我只使用 IO::Socket::SSL 模块来打开它的。一切都在任何地方都有效,除了 chrome 因此他们为 wss 协议改变了一些东西。而且我不确定出了什么问题。它似乎纯粹是 ssl 握手,它只产生一条错误消息。 https 确实在同一个服务器模块上工作,
  • 然而 websocket 本身对于基于 chrome 的 javascript websocket 客户端已损坏。任何其他浏览器或客户端都可以在 wss 上运行。就像使用 Firefox 一样,您可以通过 wss 连接进行连接和聊天.. 它仅在 chrome 中完全隔离.. 所以我的猜测是 chrome 改变了一些东西。而且我不知道如何修复这部分.. 这样 chrome 终于可以再次工作了.. 因为有很多 chrome 用户抱怨他们无法再打开聊天网站.. 我不得不为他们打开 http能够通过ws聊天..
  • javascript 基础:var wserver = 'wss://chat.lichtsnel.nl:7474'; function connect() { ... socket = new WebSocket(wserver); socket.onopen = function() {..} socket.onmessage = function(evt) {.. etc 我的服务器模块在线:github.com/FactorialCoin/base/blob/master/perl/site/lib/…
  • “然而 websocket 本身对于基于 chrome 的 javascript websocket 客户端来说是坏的。” - 这绝对不是真的。 WSS 通常也适用于 Chrome,并且被大量使用,包括在 stackoverflow.com 上。例如,试试tests on websocket.org。因此,这是您的特定用例不起作用 - 但不幸的是,您没有提供足够的详细信息,只是声称 WSS 总体上已损坏。

标签: google-chrome ssl https wss


【解决方案1】:

虽然您没有提供很多详细信息,并且基本上声称 WSS 通常被 Chrome 破坏(这不是真的),但我怀疑您的代码中的以下行导致了问题:

SSL_verify_mode => SSL_VERIFY_PEER,

通过这一行,您可以请求客户端证书。请注意,您只请求一个但实际上并不需要一个,即它只是 SSL_VERIFY_PEER 而不是 SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT。这意味着如果没有发送客户端证书,TLS 握手将继续。

基于this bug report,如果 WSS 连接请求客户端证书,Chrome 似乎不会提示用户。这意味着连接将失败 - 除非之前已经为同一来源(即域+端口)请求了必要的客户端证书,因此可以使用之前的选择。鉴于您似乎使用特定于 WSS 连接的源(域+端口),这可能并非如此 - 因此它失败了。

如果您首先不需要客户端证书(很可能是这种情况,因为您将这些证书视为可选),只需删除请求证书的行。如果您确实需要客户端证书,请将您的 Websocket 与站点的其余部分放在同一来源,并在那里请求客户端证书。请参阅 here 了解如何完成此操作的典型方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-06
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多