与未签名证书的SSL连接

时间:2011-12-07 10:16:18

标签: iphone ssl xamarin.ios certificate ios-simulator

我正在使用我们正在开发的iOS应用程序遇到以下问题。在我的服务器上,我正在运行WCF服务。此服务在HTTPS中运行。我写了一个小测试程序,看看我是否可以从另一台PC上连接它:

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

Console.WriteLine("Press key to start webrequest");
Console.ReadKey();

WebRequest wr = WebRequest.Create("https://<serveraddress.here.com>");
Stream stream = wr.GetResponse().GetResponseStream();

Console.WriteLine(new StreamReader(stream).ReadToEnd());

Console.ReadKey();

这按预期工作并返回html代码。请注意,我们正在使用ServicePointManager.ServerCertificateValidationCallback来确保证书在任何情况下都是可信任的。

iPhone上的MonoTouch中的相同代码会返回以下错误:

System.Net.WebException has been thrown
Error getting response stream (Write: BeginWrite failure): SendFailure
at System.Net.HttpWebRequest.EndGetResponse (IAsyncResult asyncResult)

连接到另一个已签名的https网站(例如paypal)可以正常工作。也没有https(常规http)连接到服务器工作正常。

似乎忽略了ServerCertificateValidationCallback而在某处失败了。有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

  

使用未签名证书的SSL连接

我怀疑您使用的是自己制作的自签名(不是未签名)证书(例如makecert)以供临时使用。< / p>

正如其他人在评论中所说的那样,这应该适用于很多人在开发应用程序时做类似的事情。

  

似乎他忽略了ServerCertificateValidationCallback并且失败了。有什么方法可以解决这个问题吗?

Mono(和MonoTouch)支持ServerCertificateValidationCallback和旧ICertificatePolicy方法,以允许应用程序在接受(或拒绝)X.509时使用 last 字证书。您可以尝试其他方法 - 但我不确定这是问题。

您还可以将(完整的,非部分的)堆栈跟踪与评论ServerCertificateValidationCallback的相同代码进行比较。如果错误相同那么它可能与证书相关,否则它不是(SSL / TLS可能出现更多问题; - )

可悲的是,我不能给你更具体的帮助,因为你的问题缺乏重要的细节。

  • 您使用的是什么版本的MonoTouch?

  • MonoTouch异常的完整堆栈跟踪为您提供了什么?从您提供的部分内容中,并非100%明确表示在验证证书时会出现问题。

  • 您在哪里/如何执行示例代码?例如它是在Mono还是Microsoft .NET?哪个版本?

我建议您打开http://bugzilla.xamarin.com的错误报告(并包含缺失的详细信息),因为我们可能需要更多数据(例如SSL通信的wireshark日志)。