【问题标题】:Android SSL Error Handshake FailedAndroid SSL 错误握手失败
【发布时间】:2013-12-11 19:11:32
【问题描述】:

我有一个可以在我的家庭网络上运行的 Android 应用程序,并且没有这些握手错误。但是,当将此应用程序发送给我的客户并通过他们的 wifi 网络对其进行测试时,我会收到这些日志。

E/chromium(15135): external/chromium/net/socket/ssl_client_socket_openssl.cc:792: [1211/175912:ERROR:ssl_client_socket_openssl.cc(792)] handshake failed; returned 0, SSL error code 5, net_error -107
W/chromium(15135): external/chromium/net/http/http_stream_factory_impl_job.cc:865: [1211/175912:WARNING:http_stream_factory_impl_job.cc(865)] Falling back to SSLv3 because host is TLS intolerant: 

我在我的应用程序内的 android webview 中加载了 https URL。除了这些错误,我没有其他信息。你们知道为什么会在特定网络上发生这种情况吗,我现在真的没有想法。

【问题讨论】:

  • 还是没有答案?惊人的!我遇到了同样的问题
  • 请发表答案

标签: android ssl ssl-certificate


【解决方案1】:

最近我在测试连接特定服务器时发生了类似的错误: 握手失败;返回 -1,SSL 错误代码 1,net_error -103

我从chromium源代码中搜索找到了一些有用的原因,说明了ret code的含义。也许它可以帮助你找到原因。

SSL 错误代码 5:

chromium//src/third_party/boringssl/src/include/openssl/ssl.h

/* SSL_ERROR_SYSCALL 表示操作在库外部失败。 调用者应该咨询系统特定的错误机制。这是 通常 |errno|但如果使用自定义 |BIO| 可能是自定义的。它 如果传输返回 EOF,也可能会发出信号,在这种情况下 操作的返回值将为零。 */

define SSL_ERROR_SYSCALL 5

net_error -107

// 发生 SSL 协议错误。

NET_ERROR(SSL_PROTOCOL_ERROR, -107)

如果您想了解更多详细信息,打印此日志的主要功能如下:

chromium//src/net/socket/ssl_server_socket_impl.cc

    int SSLServerSocketImpl::DoHandshake() {
      crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
      int net_error = OK;
      int rv = SSL_do_handshake(ssl_.get());

      if (rv == 1) {
        completed_handshake_ = true;
      // The results of SSL_get_peer_certificate() must be explicitly freed.
      bssl::UniquePtr<X509> cert(SSL_get_peer_certificate(ssl_.get()));
      if (cert) {
      // The caller does not take ownership of SSL_get_peer_cert_chain's
      // results.
      STACK_OF(X509)* chain = SSL_get_peer_cert_chain(ssl_.get());
      client_cert_ = CreateX509Certificate(cert.get(), chain);
      if (!client_cert_.get())
        return ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT;
    }
  } else {
    int ssl_error = SSL_get_error(ssl_.get(), rv);
    OpenSSLErrorInfo error_info;
    net_error = MapOpenSSLErrorWithDetails(ssl_error, err_tracer, 
&error_info);

    // SSL_R_CERTIFICATE_VERIFY_FAILED's mapping is different between client and
    // server.
    if (ERR_GET_LIB(error_info.error_code) == ERR_LIB_SSL &&
        ERR_GET_REASON(error_info.error_code) ==
        SSL_R_CERTIFICATE_VERIFY_FAILED) {
      net_error = ERR_BAD_SSL_CLIENT_AUTH_CERT;
    }

    // If not done, stay in this state
    if (net_error == ERR_IO_PENDING) {
      GotoState(STATE_HANDSHAKE);
    } else {
      LOG(ERROR) << "handshake failed; returned " << rv << ", SSL error code "
                 << ssl_error << ", net_error " << net_error;
      net_log_.AddEvent(
          NetLogEventType::SSL_HANDSHAKE_ERROR,
          CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, 
error_info));
    }
  }
  return net_error;
}

【讨论】: