c# - 安卓 Xamarin C# : Https with ServiceStack and self signed certificates

标签 c# android ssl xamarin servicestack

所以我正在使用自签名证书将我所有的 Http 网络服务更改为 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 时出现调用我的应用程序代码。

我的代码中是否遗漏了一些东西,比如服务堆栈需要的额外设置或类似的东西?几天来,我一直在为这个问题而苦苦挣扎,而且遇到了真正的障碍! 我试图将 web 服务调用保持为 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 的服务客户端的替代方法是使用 PCL HttpClient-based JsonHttpClient相反,它的好处是可以将其配置为使用 ModernHttpClient与:

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

它不使用 .NET HTTP 客户端堆栈,而是使用底层 iOS 和 Android 平台上可用的 native HTTP 库。然后,这应该允许您使用在 Android 注册的任何证书。

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

关于c# - 安卓 Xamarin C# : Https with ServiceStack and self signed certificates,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36393717/

相关文章:

C# - 如何改进行为树中的方法覆盖性能?

asp.net-mvc - 在没有 SSL 的情况下使用时,AntiForgeryConfig.RequireSsl 会导致随机错误

c# - 将位图转换为图标

c# - 遍历列表并删除项目的正确方法

c# - 如何将异常标记为已记录(并且只记录一次)?

android - 发送消息时未注册 Firebase 通知服务

安卓工作室 1.5.1 : Could not find property 'vectorDrawables'

java - 如何在获取最后位置时解决 mLastLocation、mLatitudeText、mLongitudeText

安卓 ICS : Problems to get the server certificate of the HttpsUrlConnection

ios - 如何获取从我的 iPhone 发送的流量的 SSL key ?