我的电脑出现了一个很奇怪的问题,我似乎无法理解。有时(几乎总是在重启后),Spotify 应用程序似乎无法连接到其服务器。当这种情况发生时,Chrome 也会受到影响,并且会影响与 Spotify 相关的所有已知网站(其网页、网络播放器、其社区等,基本上是 *.spotify.com 的全部)。
它看起来像这样,请注意空的远程地址列,这让我怀疑存在 DNS 问题。
现在,过了一会儿,这个问题似乎可以自行“修复”,但需要大约 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)
我将这个答案放在社区维基上,希望有人能够关注我的发现(因为这对于评论来说太长了)。