在不忽略 SSL 错误的情况下 android Web 视图中握手失败 SSL 错误的最佳解决方案

Best solution for the handshake failed SSL error in android web view without ignoring SSL errors

我创建了一个向用户显示特定站点的应用程序,并且我正在使用 Web 视图来完成该任务。当我尝试加载该特定站点时,Web 视图什么也没显示,log cat 说,

E/chromium: [ERROR:ssl_client_socket_impl.cc(946)] handshake failed; returned -1, SSL error code 1, net_error -202

所以经过一番搜索后,我发现 answer 可以忽略此 SSL 证书错误并使用以下代码我可以加载该站点。

webView.setWebViewClient(new WebViewClient() {  
    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {              
        handler.proceed();
        Log.d("ssl_error", error.toString());                
    }
});

当我发送 error.toString() 到 log cat 时,它说,

primary error: 3 certificate: Issued to: [some details of the company of that specific site] Issued by: CN=GeoTrust RSA CA 2018,OU=www.digicert.com,O=DigiCert Inc,C=US; on URL: [that spefic site url]

但我想在不忽略该错误的情况下修复该错误。

如前面提到的堆栈溢出 answer 我无法匹配 https://developer.android.com/training/articles/security-config[=30= 的详细信息] 来解决这个问题而不忽略它。我应该如何配置网络来解决这个问题?

注意:- 我只想使用一个特定站点。无需与任何网站合作

“主要错误:3”指的是在 SslError class (documentation) 中定义的 SSL_UNTRUSTED 错误代码。

这意味着您的客户端已连接到具有不可接受的 SSL 证书链的服务器。具体来说,您的设备不接受链的根 CA 作为受信任的。可能是:

  • 自签名证书
  • 带有根证书的证书链未在您的密钥库中列为受信任的根证书:
    • 根目录可能已被删除;例如因为不值得信任!
    • 根可能是您的(过时的)设备还不知道的新根,
  • 证书链损坏

请注意,这些情况可能比过期的证书更糟糕/更危险。

我将从使用 https://www.ssllabs.com/ssltest/ 开始检查 URL 并查看其内容。根据它所说的,正确 修复可能是以下之一:

  • 联系网站所有者,让他们更新网站的 SSL 证书。
  • 更新您的设备(客户端)以获取您的供应商认可的当前可信根证书集。
  • 按照设备供应商的说明,将服务器证书(不是根或中间 CA 证书)添加为可信证书。

请注意,最后一个实际上是在说“我信任此服务器”……只有在您可以安全地获取服务器证书的情况下,您才应该这样做。

Android 应用程序代表用户执行此操作(IMO)是个坏主意。信任请求权限的应用程序是个坏主意。除非你有很强的保证该应用程序是值得信赖的

为什么?因为能够安装受信任的根证书的应用程序 可以 安装错误的证书,为各种肮脏的事情打开大门。


更新

SSLTest results 表示证书链不完整,这解释了您收到 SSL_UNTRUSTED 错误的原因

您应将此报告给网站所有者:

  • 证书链不完整,应该修复。
  • 该网站是 运行 旧的/过时的/已弃用的 SSL 软件。
  • 该站点还有许多其他安全漏洞。

如果他们没有响应,明智的做法是停止尝试使用他们的网站。无法安全访问。