【问题标题】:Android Xamarin C#: Https with ServiceStack and self signed certificatesAndroid Xamarin C#:带有 ServiceStack 和自签名证书的 Https
【发布时间】:2016-04-04 02:27:30
【问题描述】:

所以我正在使用自签名证书将我的所有 Http webservices 更改为 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 时才会出现问题在我的应用代码中调用。

我的代码中是否缺少某些内容,例如服务堆栈需要的额外设置或类似的东西?几天来,我一直在努力解决这个问题,而且遇到了一个真正的路障! 我试图将 web 服务调用保留为 servicestack,因为我希望它是 PCL 而不是 android 特定代码。

谢谢。

【问题讨论】:

    标签: c# android ssl xamarin servicestack


    【解决方案1】:

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

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

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

    使用 ServiceStack 的基于 HttpWebRequest 的服务客户端的另一种方法是使用 PCL HttpClient-based JsonHttpClient,它的好处是可以将 ModernHttpClient 配置为:

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

    不使用 .NET HTTP 客户端堆栈,而是使用底层 iOS 和 Android 平台上可用的本机 HTTP 库。这应该让您可以使用在 Android 中注册的任何证书。

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

    【讨论】:

    • 所以我尝试添加 ServerCertificateValidationCallback 行作为我的应用程序中发生的第一件事,以便接受任何证书(只是为了测试这对我有用),我似乎仍然得到相同的“ WebException:请求超时”错误消息。我不明白为什么会发生这个异常,我读到它是因为正在发送请求而没有收到任何回复,这是正确的吗?我认为我的下一步行动可能是尝试另一个内置 https 服务的 xamarin android,看看是否有希望。
    • @wootank 不确定,但我首先会考虑让基本的 .NET HttpWebRequest 直接使用 url 工作,即:(HttpWebRequest) WebRequest.Create("url") 这将删除 .NET BCL 之上的任何附加层类。如果它不起作用,我会向 Xamarin 提交错误报告,以便他们告诉你根本问题是什么。
    • 嘿,感谢您的帮助,最后我们决定单独使用 JsonHttpClient 和 ModernHttpClient 提出您的第二个建议,这一切都很顺利:)
    猜你喜欢
    • 1970-01-01
    • 2014-05-05
    • 2020-04-24
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    相关资源
    最近更新 更多