【问题标题】:Xamarin webview Android SSL error untrusted - how to add trusted certificateXamarin webview Android SSL错误不受信任 - 如何添加受信任的证书
【发布时间】:2021-02-05 20:57:05
【问题描述】:

我在 Android 应用程序上的 Xamarin 应用程序出现 SSL 错误不受信任(iOS 运行良好)。我需要使用 Webview。

我按照 httpclient 的说明操作:https://thomasbandt.com/certificate-and-public-key-pinning-with-xamarin。我需要设置 TrustManagerFactory、KeyManagerFactory 和 KeyStore,但在 WebViewRenderer 和 WebViewClient 中我找不到将我的证书添加为受信任的选项。我不想比较 OnReceivedSslError 覆盖方法中的证书,因为此方法中的证书是最终证书(有效期最长为一年)。我想在 webview 中检查证书方法之前将我的根证书和中间证书添加到受信任的证书列表中。

导出渲染器:

public class CustomWebView : WebViewRenderer
    {
        private TrustManagerFactory _trustManagerFactory;
        private KeyManagerFactory _keyManagerFactory;
        private KeyStore _keyStore;

        public CustomWebView(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
        {
            base.OnElementChanged(e);
            if (e.NewElement != null)
            {
                var customWebViewClient = new CustomWebViewClient();
                _trustManagerFactory = CertificateHelper.TrustManagerFactory;
                _keyManagerFactory = CertificateHelper.KeyManagerFactory;
                _keyStore = CertificateHelper.KeyStore;
                Control.SetWebViewClient(customWebViewClient);
            }
        }
    }

这里如何设置 TrustManagerFactory、KeyManagerFactory 和 KeyStore?

【问题讨论】:

  • 您可以让 HttpsURLConnection 信任一组特定的 CA。请检查本机 android 中的建议。 developer.android.com/training/articles/…
  • 我已经检查了这条路径,但是我看不到如何获取 webview 或 webview 客户端的核心机制来修改 SSL 工厂或覆盖任何方法。第二件事是,此解决方案执行 Load(null, null) 进行初始化并清除默认信任的所有 CA,因此只有我添加的自定义证书才会被信任。换句话说,如果我不添加任何证书,那么所有 https 连接都将不受信任。那不是我想要的。第三件事 - 即使我修改了 urlconnection 的 SSL 工厂,我也只更改了我想要的未引用 webview 的对象

标签: xamarin xamarin.forms xamarin.android


【解决方案1】:

我终于找到了可行的解决方案。在我的情况下,添加最终用户证书或中间证书(单独或一起)使一切正常。最终用户证书是短期的,所以我建议添加长期中间证书。

添加: android:networkSecurityConfig="@xml/network_security_config" 显示在应用程序部分。

将新的 xml 文件(构建操作 AndroidResource)添加到资源 -> xml -> network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
  <base-config>
    <trust-anchors>
      <certificates src="@raw/untrusted_ca"/>
      <certificates src="system"/>
    </trust-anchors>
  </base-config>
</network-security-config>

证书名称只能由小写字母、数字和下划线组成。

在:Resources -> raw -> untrusted_ca.pem 中添加证书(构建操作:AndroidResource)

现在 android webview 在应用程序级别信任服务器,因此在连接到特定服务器时不会再发生 ssl 错误。

【讨论】:

    猜你喜欢
    • 2015-02-14
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多