我创建了一个向用户显示特定站点的应用程序,并使用 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的详细信息来解决此问题而不忽略它。我应该如何配置网络来解决这个问题?
注意:- 我只想使用一个特定站点。无需与任何网站合作
“主要错误:3”指的是
SslError
类(文档)中定义的 SSL_UNTRUSTED 错误代码。
这意味着您的客户端连接到的服务器的 SSL 证书链不可接受。具体来说,您的设备不接受该链的根 CA 为可信。可能是:
请注意,这些情况可能比过期的证书更糟糕/更危险。
我首先使用 https://www.ssllabs.com/ssltest/ 检查 URL 并查看其内容。根据它的说法,正确修复可能是以下之一:
请注意,最后一个实际上是在说“我信任此服务器”......并且只有当您可以安全地获取服务器的证书时才应该这样做。
(在我看来,Android 应用程序代表用户执行此操作是一个坏主意。从用户的角度来看,信任任何“请求”权限执行此操作的 Android 应用程序都是一个坏主意。为什么?因为能够安装受信任根证书的应用程序可能安装错误的证书,从而为各种肮脏行为打开了大门。)
SSLTest 结果
表明证书链不完整,这解释了为什么您收到 SSL_UNTRUSTED 错误 您应该向网站所有者报告此情况:
证书链不完整,需要修复。