Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
忽略Xamarin.Forms(PCL)中的SSL证书错误_Ssl_Xamarin.forms - Fatal编程技术网

忽略Xamarin.Forms(PCL)中的SSL证书错误

忽略Xamarin.Forms(PCL)中的SSL证书错误,ssl,xamarin.forms,Ssl,Xamarin.forms,有没有任何方法可以像这里描述的那样:但在Xamarin.Forms PCL应用程序中?我正在使用HttpClient连接到服务器。ServicePointManager未在PCL中定义,而是在特定于平台的类中定义 在Xamarin.iOS和Xamarin.Android中都有ServicePointManager,用法相同。您可以在平台项目的任何类中引用它。然而,目前还没有此类课程,而且似乎无法为Windows Phone应用程序提供此类课程 示例: private HttpClient _ht

有没有任何方法可以像这里描述的那样:但在Xamarin.Forms PCL应用程序中?我正在使用HttpClient连接到服务器。

ServicePointManager
未在PCL中定义,而是在特定于平台的类中定义

Xamarin.iOSXamarin.Android中都有
ServicePointManager
,用法相同。您可以在平台项目的任何类中引用它。然而,目前还没有此类课程,而且似乎无法为Windows Phone应用程序提供此类课程

示例:

private HttpClient _httpClient;
public HttpClient HttplicentAccount
{
    get
    {
        _httpClient = _httpClient ?? new HttpClient
        (
            new HttpClientHandler()
            {
                ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) =>
                {
                    //bypass
                    return true;
                },
            }
            , false
        )
        {
            BaseAddress = new Uri("YOUR_API_BASE_ADDRESS"),
        };

        // In case you need to send an auth token...
        _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Authorization", "YOUR_TOKEN");
        return _httpClient;
    }
}
//Xamarin.Android
公共类主活动:全局::Xamarin.Forms.Platform.Android.Forms应用活动
{
创建时受保护的覆盖无效(捆绑包)
{
//您可以在此处使用ServicePointManager
服务点管理器
.ServerCertificateValidationCallback+=
(发件人、证书、链、sslPolicyErrors)=>真;
base.OnCreate(bundle);
全局::Xamarin.Forms.Forms.Init(这个,bundle);
加载应用程序(新应用程序());
}
}
//沙马林
公共部分类AppDelegate:global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
{
公共覆盖bool FinishedLaunching(UIApplication应用程序、NSDictionary选项)
{
服务点管理器
.ServerCertificateValidationCallback+=
(发件人、证书、链、sslPolicyErrors)=>真;
全局::Xamarin.Forms.Forms.Init();
加载应用程序(新应用程序());
返回基地。完成发射(应用程序,选项);
}
}

如果您使用的是
AndroidClientHandler
,则需要提供
SSLSocketFactory
和禁用所有检查的
主机名验证程序的自定义实现。要做到这一点,您需要子类化
AndroidClientHandler
,并重写适当的方法

internal class BypassHostnameVerifier : Java.Lang.Object, IHostnameVerifier
{
    public bool Verify(string hostname, ISSLSession session)
    {
        return true;
    }
}

internal class BypassSslValidationClientHandler : AndroidClientHandler
{
    protected override SSLSocketFactory ConfigureCustomSSLSocketFactory(HttpsURLConnection connection)
    {
        return SSLCertificateSocketFactory.GetInsecure(1000, null);
    }

    protected override IHostnameVerifier GetSSLHostnameVerifier(HttpsURLConnection connection)
    {
        return new BypassHostnameVerifier();
    }
}
然后

var handler = new BypassSslValidationClientHandler();
var httpClient = new System.Net.Http.HttpClient(handler);

我遇到了这个问题,但有一个稍微不同的错误消息:

Ssl error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED
  at /Users/builder/jenkins/workspace/archive-mono/2019-02/android/release/external/boringssl/ssl/handshake_client.c:1132
我在
OnCreate(MainActivity.cs)
中修复了它:


这是Android的修复程序,将相同的代码放入iOS的FinishedLaunching(AppDelegate.cs)
中也应该可以使用。

使用Xamarin.Forms上的唯一代码,实例化一个HttpClientHandler 示例:

private HttpClient _httpClient;
public HttpClient HttplicentAccount
{
    get
    {
        _httpClient = _httpClient ?? new HttpClient
        (
            new HttpClientHandler()
            {
                ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) =>
                {
                    //bypass
                    return true;
                },
            }
            , false
        )
        {
            BaseAddress = new Uri("YOUR_API_BASE_ADDRESS"),
        };

        // In case you need to send an auth token...
        _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Authorization", "YOUR_TOKEN");
        return _httpClient;
    }
}
  • 将这行代码放入MainActivity.cs中的OnCreate中: System.Net.ServicePointManager.ServerCertificateValidationCallback+=(发件人、证书、链、sslPolicyErrors)=>true
应该是这样的:

protected override void OnCreate(Bundle savedInstanceState)
        {

            // to bypass ssl
            System.Net.ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
            ...
            ..
            LoadApplication(new App());
        }
  • 现在更改var httpClient=new httpClient()

  • to:var httpClient=newhttpclient(new System.Net.Http.HttpClientHandler())

  • 不要忘记调用IP地址而不是使用localhost


这对我不起作用。回调永远不会被调用,并且会生成一个异常,表明SSL无效。AndroidClientHandler似乎不支持ServerCertificateValidationCallback。您获得了在Android上处理此问题的更新信息吗?此解决方案不适用于Android此处的所有解决方案,此解决方案在最新2019/20更新后在VS2019中适用于Android。应用上述代码后仍会收到相同的错误。
public static HttpClient PreparedClient() {
 HttpClientHandler handler = new HttpClientHandler();
 handler.ServerCertificateCustomValidationCallback+= (sender, cert, chain,sslPolicyErrors) => { return true; }; 
 HttpClient client = new HttpClient(handler); return client; 
}

HttpClient client = PreparedClient();