Android Xamarin C#:Https with ServiceStack和自签名证书

时间:2016-04-04 02:27:30

标签: c# android ssl xamarin servicestack

所以我正在使用自签名证书将我所有的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上的互联网应用程序导航到该网站没有问题,所以似乎问题只出现在尝试制作ServiceStack时在我的应用代码中调用。

我在代码中遗漏了什么,比如服务堆栈需要的额外设置还是类似的东西?我已经在这个问题上苦苦挣扎了好几天了,真正的路障! 我试图将webservice调用保持为servicestack,因为我希望它是PCL而不是特定于Android的代码。

感谢。

1 个答案:

答案 0 :(得分:4)

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

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

但您希望将验证限制为使用自签名证书。

使用ServiceStack的基于HttpWebRequest的服务客户端的另一种方法是使用PCL HttpClient-based JsonHttpClient代替,它具有可以配置为使用ModernHttpClient的优点:

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

而不是使用.NET HTTP Client堆栈使用底层iOS和Android平台上可用的本机HTTP库。这应该允许您使用在Android注册的任何证书。

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