android web 视图中握手失败 SSL 错误的最佳解决方案,而不忽略 SSL 错误

问题描述 投票:0回答:1

我创建了一个向用户显示特定站点的应用程序,并使用 Web 视图来完成该任务。当我尝试加载该特定网站时,网络视图什么也没有显示,日志猫说,

E/chromium:[错误:ssl_client_socket_impl.cc(946)]握手失败;返回 -1,SSL 错误代码 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 时,它说,

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

但我想修复该错误而不忽略它。

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

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

java android ssl webview android-network-security-config
1个回答
11
投票

“主要错误:3”指的是

SslError
类(文档)中定义的 SSL_UNTRUSTED 错误代码。

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

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

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

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

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

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

(在我看来,Android 应用程序代表用户执行此操作是一个坏主意。从用户的角度来看,信任任何“请求”权限执行此操作的 Android 应用程序都是一个坏主意。为什么?因为能够安装受信任根证书的应用程序可能安装错误的证书,从而为各种肮脏行为打开了大门。)


更新

SSLTest 结果

表明证书链不完整,这解释了为什么您收到 SSL_UNTRUSTED 错误 您应该向网站所有者报告此情况:

证书链不完整,需要修复。
  • 该网站正在运行旧的/过时的/已弃用的 SSL 软件。
  • 该网站还存在许多其他安全漏洞。
  • 如果他们没有响应,明智的做法是停止尝试使用他们的网站。无法安全访问。

© www.soinside.com 2019 - 2024. All rights reserved.