1

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

E/chromium: [ERROR:ssl_client_socket_impl.cc(946)] 握手失败;返回 -1,SSL 错误代码 1,net_error -202

因此,经过一番搜索,我找到了忽略此 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()给日志猫时,它说,

主要错误:3 证书:颁发给:[该特定站点公司的一些详细信息] 颁发者:CN=GeoTrust RSA CA 2018,OU=www.digicert.com,O=DigiCert Inc,C=US; 在 URL 上:[那个特定的站点 url]

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

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

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

4

1 回答 1

6

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

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

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

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

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

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

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

Android 应用程序代表用户执行此操作是(IMO)一个坏主意。信任请求权限的应用程序是一个坏主意。除非您非常确信该应用程序是值得信赖的

为什么?因为能够安装受信任的根证书的应用程序可能会安装错误的证书,从而为各种讨厌的事情打开了大门。


更新

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

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

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

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

于 2020-07-14T09:51:22.160 回答