Android Xamarin C#:带有ServiceStack和自签名证书的Https

因此,我正在使用自签名证书将所有Http Web服务更改为Https进行测试(对于我正在制作的android应用),并且它们在服务器端都可以正常运行,我知道这是因为我可以将证书添加到PC的证书存储中,并且完美访问该网站,涉及到我的android应用对其进行调用时,我在客户端遇到了什么麻烦.

我的Servicestack调用看起来像这样:

        var client = new JsonServiceClient(stubServicesBaseUrl);

        return client.Get(new GetLastStatusUpdate()).StatusUpdates.Last();

并且这些曾经在只有http的情况下工作,但是自从我添加了将自签名证书添加到android受信任的凭据存储中的代码以来,调用已停止工作,而请求似乎超时了.

        byte[] certificate;
        using (var streamReader = new StreamReader(Assets.Open("ScoutTestCert.crt")))
        {
            using (var byteStream = new MemoryStream())
            {
                streamReader.BaseStream.CopyTo(byteStream);
                certificate = byteStream.ToArray();
            }
        }

        var installCertificate = KeyChain.CreateInstallIntent();
        installCertificate.PutExtra(KeyChain.ExtraCertificate, certificate);
        StartActivity(installCertificate);

上面的代码将证书添加到“用户”部分中的android可信存储中,并允许我通过androidEmulator上的Internet应用程序导航到该站点而不会出现问题,因此看来问题仅在尝试在我的ServiceStack中进行调用时出现应用程式程式码.

我是否在代码中缺少某些内容,例如服务堆栈需要的额外设置或类似内容?几天来,我一直在为这个问题而苦苦挣扎!
我试图将webservice调用保留为servicestack,因为我希望它是PCL而不是android特定代码.

谢谢.

解决方法:

ServiceStack的.NET Service Clients使用.NET的BCL内置的HttpWebRequest来使自签名证书与.NET HTTP客户端一起使用,您需要注册custom Certificate Validation Callback,例如下面的回调将使所有证书成功:

ServicePointManager.ServerCertificateValidationCallback += 
    (sender, certificate, chain, sslPolicyErrors) => true;

但是您可能希望将验证范围限制为与您的自签名证书一起使用.

使用ServiceStack的基于HttpWebRequest的Service Client的替代方法是使用PCL HttpClient-based JsonHttpClient,这具有以下优点:可以将其配置为使用ModernHttpClient并具有以下功能:

JsonHttpClient.GlobalHttpMessageHandlerFactory = () => 
    new NativeMessageHandler()

哪个代替使用.NET HTTP Client堆栈,而是使用基础iOS和Android平台上可用的本机HTTP库.然后,您应该可以使用在Android上注册的所有证书.

为了使用通过ModernHttpClient在.NET中注册的不受信任的自签名证书,您将需要使用pro version of ModernHttpClient作为mentioned on this thread.

上一篇:At-rule | CSS @ 规则


下一篇:判断文件是否存在的shell脚本代码!