Xamarin webview Android SSL错误不受信任-如何添加受信任证书

Xamarin webview Android SSL错误不受信任-如何添加受信任证书,xamarin,xamarin.forms,xamarin.android,Xamarin,Xamarin.forms,Xamarin.android,我在adroid应用程序(iOS运行良好)上的Xamarin应用程序上存在不受信任的SSL错误。我需要使用Webview 我遵循httpclient的以下说明:。我需要设置TrustManagerFactory、KeyManagerFactory和KeyStore,但在WebViewRenderer和WebViewClient中,我找不到将证书添加为受信任证书的选项。我不想比较OnReceivedSlerror override方法中的证书,因为此方法中的证书是最终证书(将过期一年)。我想先将我

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

我遵循httpclient的以下说明:。我需要设置TrustManagerFactory、KeyManagerFactory和KeyStore,但在WebViewRenderer和WebViewClient中,我找不到将证书添加为受信任证书的选项。我不想比较OnReceivedSlerror override方法中的证书,因为此方法中的证书是最终证书(将过期一年)。我想先将我的根证书和中间证书添加到受信任证书列表中,然后再检查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);
            }
        }
    }
公共类CustomWebView:WebViewRenderer
{
私人TrustManagerFactory\u TrustManagerFactory;
private KeyManagerFactory\u KeyManagerFactory;
私有密钥库_密钥库;
公共CustomWebView(上下文):基础(上下文)
{
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(例如NewElement!=null)
{
var customWebViewClient=new customWebViewClient();
_trustManagerFactory=CertificateHelper.trustManagerFactory;
_keyManagerFactory=CertificateHelper.keyManagerFactory;
_密钥库=CertificateHelper.keyStore;
控件。SetWebViewClient(customWebViewClient);
}
}
}

如何在此处设置TrustManagerFactory、KeyManagerFactory和密钥库?

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

加:
android:networkSecurityConfig=“@xml/network\u security\u config”
显示在应用程序部分

将新的xml文件(构建操作AndroidResource)添加到Resources->xml->network\u security\u 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错误。

您可以通过HttpsURLConnection信任特定的CA集。请检查本机android中的建议。我已经检查了这个路径,但是我没有看到如何让webview或webview客户端的核心机制修改SSL工厂或重写任何方法的选项。第二件事是,该解决方案执行Load(null,null)进行初始化,并清除默认情况下受信任的所有CA,因此只有我添加的自定义证书才受信任。换句话说,按照这种方式,如果我不添加任何证书,那么所有https连接都将不受信任。那不是我想要的。第三件事——即使我修改了urlconnection的SSL工厂,我也只会更改我想要更改的对象,它并没有引用到webview