来自 Github 上的 Chromium 源代码

来自 Github 上的 Chromium 源代码

我的电脑出现了一个很奇怪的问题,我似乎无法理解。有时(几乎总是在重启后),Spotify 应用程序似乎无法连接到其服务器。当这种情况发生时,Chrome 也会受到影响,并且会影响与 Spotify 相关的所有已知网站(其网页、网络播放器、其社区等,基本上是 *.spotify.com 的全部)。

它看起来像这样,请注意空的远程地址列,这让我怀疑存在 DNS 问题。

Chrome 的网络标签

现在,过了一会儿,这个问题似乎可以自行“修复”,但需要大约 5-10 分钟。与此同时,Brave 浏览器(基本上是伪装的 Chrome)运行正常,PowerShell 中的 Invoke-WebRequest 也是如此。运行ipconfig /flushdns并重新启动 Chrome 没有任何效果。

我确实知道 Spotify 应用程序确实在后台使用了 Chrome 引擎,但我希望它运行自己的捆绑引擎,而不是我安装的 Chrome?那么为什么它们会互相影响?此外,当这个问题停止时,它似乎同时停止了两个应用程序。

我怀疑是 IPv6 让我很烦。Spotify 实际上解析了 IPv6 地址,而我没有 IPv6。不过,我确实在 Wi-Fi 适配器上禁用了 IPv6,但无济于事。

我还验证了 Chrome 和 Spotify 都可以通过 Windows 防火墙。

我在故障排除方面有点卡住了,希望大家能提出一些新想法。此外,Spotify 似乎是唯一一家已知存在此问题的服务,这也很奇怪。

编辑:我注意到这会影响更多网站。plex.tv 以及 Netflix 应用程序都存在同样的问题。当我无法访问这些网站时,其他网站却可以正常访问,例如 github.com、google.com、AWS 控制台等。

我被难住了。我设法在 Chrome 中启动了调试记录器,当请求失败的 URL 时,我得到了以下信息:

[15564:26264:0704/214452.685:VERBOSE1:network_delegate.cc(32)] NetworkDelegate::NotifyBeforeURLRequest: https://plex.tv/
[33512:27416:0704/214452.735:INFO:cpu_info.cc(53)] Available number of cores: 8
[9692:25292:0704/214454.563:VERBOSE1:cast_socket.cc(220)] [192.168.0.148:8009, auth=SSL_VERIFIED] Connect readyState = ReadyState::NONE
[9692:25292:0704/214454.563:VERBOSE1:cast_socket.cc(379)] [192.168.0.148:8009, auth=SSL_VERIFIED] DoTcpConnect
[9692:25292:0704/214454.607:VERBOSE1:cast_socket.cc(393)] [192.168.0.148:8009, auth=SSL_VERIFIED] DoTcpConnectComplete: 0
[9692:25292:0704/214454.607:VERBOSE1:cast_socket.cc(410)] [192.168.0.148:8009, auth=SSL_VERIFIED] DoSslConnect
[15564:26264:0704/214454.622:ERROR:ssl_client_socket_impl.cc(980)] handshake failed; returned -1, SSL error code 1, net_error -101
[9692:25292:0704/214454.622:VERBOSE1:cast_socket.cc(433)] [192.168.0.148:8009, auth=SSL_VERIFIED] DoSslConnectComplete: -101
[9692:25292:0704/214454.622:VERBOSE1:cast_socket.cc(653)] [192.168.0.148:8009, auth=SSL_VERIFIED] SetErrorState ChannelError::AUTHENTICATION_ERROR
[9692:25292:0704/214454.622:VERBOSE1:cast_socket.cc(575)] DoConnectCallback (error_state = ChannelError::AUTHENTICATION_ERROR)
[9692:25292:0704/214454.622:VERBOSE1:cast_socket.cc(615)] [192.168.0.148:8009, auth=SSL_VERIFIED] Close ReadyState = ReadyState::CONNECTING
[9692:25292:0704/214454.622:VERBOSE1:cast_socket.cc(220)] [192.168.0.148:8009, auth=SSL_VERIFIED] Connect readyState = ReadyState::NONE
[9692:25292:0704/214454.622:VERBOSE1:cast_socket.cc(379)] [192.168.0.148:8009, auth=SSL_VERIFIED] DoTcpConnect
[9692:25292:0704/214454.626:VERBOSE1:cast_socket.cc(393)] [192.168.0.148:8009, auth=SSL_VERIFIED] DoTcpConnectComplete: 0
[9692:25292:0704/214454.627:VERBOSE1:cast_socket.cc(410)] [192.168.0.148:8009, auth=SSL_VERIFIED] DoSslConnect
[15564:26264:0704/214454.632:ERROR:ssl_client_socket_impl.cc(980)] handshake failed; returned -1, SSL error code 1, net_error -101
[9692:25292:0704/214454.633:VERBOSE1:cast_socket.cc(433)] [192.168.0.148:8009, auth=SSL_VERIFIED] DoSslConnectComplete: -101
[9692:25292:0704/214454.633:VERBOSE1:cast_socket.cc(653)] [192.168.0.148:8009, auth=SSL_VERIFIED] SetErrorState ChannelError::AUTHENTICATION_ERROR
[9692:25292:0704/214454.633:VERBOSE1:cast_socket.cc(575)] DoConnectCallback (error_state = ChannelError::AUTHENTICATION_ERROR)
[9692:25292:0704/214454.633:VERBOSE1:cast_socket.cc(615)] [192.168.0.148:8009, auth=SSL_VERIFIED] Close ReadyState = ReadyState::CONNECTING

192.168.0.148 是我网络上的 Chromecast,这些错误可能无关紧要,但错误行很有趣:

[15564:26264:0704/214454.632:ERROR:ssl_client_socket_impl.cc(980)] handshake failed; returned -1, SSL error code 1, net_error -101

我不明白为什么我会在多个应用程序中收到 SSL 错误,而过一段时间后错误又消失了。另外,为什么它只影响某些应用程序,而不是所有应用程序?(例如 Brave)

答案1

在我看来(通过我非常生疏的 C++ 知识快速搜索 chromium 源)它正在重复:

握手失败;返回 -1(错误)、SSL 错误代码 1(内部库错误)、net_error -101(CONNECTION_RESET)

一遍一遍又一遍。

无论这意味着什么,最好由其他更有知识的人来回答——或者​​在我真正睡着之后再回答我的问题。


来自 Github 上的 Chromium 源代码

ssl_client_socket_impl.cc 大约第 980 行)

int SSLClientSocketImpl::DoHandshake() {
  crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);

  int rv = SSL_do_handshake(ssl_.get());
  int net_error = OK;
  if (rv <= 0) {
    int ssl_error = SSL_get_error(ssl_.get(), rv);
    if (ssl_error == SSL_ERROR_WANT_X509_LOOKUP && !send_client_cert_) {
      return ERR_SSL_CLIENT_AUTH_CERT_NEEDED;
    }
    if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) {
      DCHECK(client_private_key_);
      DCHECK_NE(kSSLClientSocketNoPendingResult, signature_result_);
      next_handshake_state_ = STATE_HANDSHAKE;
      return ERR_IO_PENDING;
    }
    if (ssl_error == SSL_ERROR_WANT_CERTIFICATE_VERIFY) {
      DCHECK(cert_verifier_request_);
      next_handshake_state_ = STATE_HANDSHAKE;
      return ERR_IO_PENDING;
    }

    OpenSSLErrorInfo error_info;
    net_error = MapLastOpenSSLError(ssl_error, err_tracer, &error_info);
    if (net_error == ERR_IO_PENDING) {
      // If not done, stay in this state
      next_handshake_state_ = STATE_HANDSHAKE;
      return ERR_IO_PENDING;
    }

    LOG(ERROR) << "handshake failed; returned " << rv << ", SSL error code "
               << ssl_error << ", net_error " << net_error;
    NetLogOpenSSLError(net_log_, NetLogEventType::SSL_HANDSHAKE_ERROR,
                       net_error, ssl_error, error_info);
  }

错误代码


RV(返回值)错误代码

当 SSL 握手(SSL_do_handshake(ssl_.get())在 中SSLClientSocketImpl::DoHandshake())失败时,它会返回-1

SSL 错误代码

// SSL_ERROR_SSL indicates the operation failed within the library. The caller
// may inspect the error queue for more information.
#define SSL_ERROR_SSL 1

网络错误代码

// A connection was reset (corresponding to a TCP RST).
NET_ERROR(CONNECTION_RESET, -101)

我将这个答案放在社区维基上,希望有人能够关注我的发现(因为这对于评论来说太长了)。

相关内容