Android webview获取sslError SSL_UNTRUSTED,但证书有效

qrjkbowd  于 2023-03-08  发布在  Android
关注(0)|答案(2)|浏览(366)

我已经在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,证书将被视为有效和可信:

为什么会这样呢?

pnwntuvh

pnwntuvh1#

对我来说,这是我试图连接的服务器的问题。它有一个中断的中间证书链。它是重定向服务器有一个中断的链。当有一个中断的链,webview没有办法解决,因为它不知道在哪里寻找正确的证书。
Use this tool来检查常见的错误配置。请确保同时检查所有重定向。
Android不支持权威信息访问
因此不存在AIA Fetching

但是?!..它在浏览器中工作是的,它在浏览器中工作,因为所有浏览器都携带一个中间体列表,当证书链断裂时可以依靠这些中间体。
**解决方案:**修复服务器上的证书链。

kqqjbcuj

kqqjbcuj2#

即使对我来说,当证书在android chrome上抛出无效CN(SSL_IDMISMATCH)时,它也会给出SSL_UNTRUSTED。添加network-security-config后,一切似乎都很好。对我来说,我安装了一个用户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>

相关问题