我已经在我的 WebViewClient 中实现了
onReceivedSslError
方法来正确处理 webview 中的无效 https 证书:
@Override
public void onReceivedSslError(WebView view, final SslErrorHandler handler, SslError error) {
final AlertDialog.Builder builder = new AlertDialog.Builder(WebActivity.this);
String message = "SSL Certificate error.";
switch (error.getPrimaryError()) {
case SslError.SSL_UNTRUSTED:
message = "The certificate authority is not trusted.";
break;
case SslError.SSL_EXPIRED:
message = "The certificate has expired.";
break;
case SslError.SSL_IDMISMATCH:
message = "The certificate Hostname mismatch.";
break;
case SslError.SSL_NOTYETVALID:
message = "The certificate is not yet valid.";
break;
}
message += " Do you want to continue anyway?";
builder.setTitle("SSL Certificate Error");
builder.setMessage(message);
builder.setPositiveButton("continue", (dialog, which) -> handler.proceed());
builder.setNegativeButton("cancel", (dialog, which) -> handler.cancel());
final AlertDialog dialog = builder.create();
dialog.show();
}
当 webview 加载我的网页时,
SslError.SSL_UNTRUSTED
错误被检测到。但是,如果我在 chrome(台式机或移动设备)中打开完全相同的 url,则证书被认为是有效且可信的:
为什么会这样?
对我来说,这是我试图访问的服务器的问题。它有一个损坏的中间证书链。这是链条断开的重定向服务器。 当链条断开时,webview 无法解决,因为它不知道在哪里寻找正确的证书。
使用此工具 检查常见的错误配置。一定要检查任何重定向。
安卓不支持权限信息访问
因此没有AIA Fetching
但是?!..它适用于浏览器 是的,它在浏览器中有效,因为所有浏览器都带有一个中间列表,当证书链断开时可以回退。
解决方案: 修复服务器上的证书链。
即使对我来说,当证书在 android chrome 上抛出无效 CN(SSL_IDMISMATCH) 时,它也会给出 SSL_UNTRUSTED。 添加了network-security-config,一切似乎都运行良好。 对我来说,我安装了一个 user-ca,它没有被 webview 接收到。
添加了这段代码,它允许我使用安装在用户凭据中的 user-ca。
<network-security-config>
<base-config>
<trust-anchors>
<!-- Trust preinstalled CAs -->
<certificates src="system" />
<!-- Additionally trust user added CAs -->
<certificates src="user" />
</trust-anchors>
</base-config>
</network-security-config>