因此,我正在使用自签名证书将所有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.