因此,我正在使用自签名证书将所有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.
总结以上是内存溢出为你收集整理的Android Xamarin C#:带有ServiceStack和自签名证书的Https全部内容,希望文章能够帮你解决Android Xamarin C#:带有ServiceStack和自签名证书的Https所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)