我们最近将我们的Xamarin工具更新为Cycle 8。
在更新后执行的例行测试中,我们很快注意到对基于WCF的服务器组件的所有HTTPS请求都失败了。我们仍然有旧版本的设备,它们工作正常。所有新编译的版本都无法连接。
连接异常总是归结为Mono.Security.Protocol.Tls.TlsException
从服务器收到的无效证书(错误代码:0xffffffff800b010f)。
为了进行调查,我们定义了ServerCertificateValidationCallback并查看了SslPolicyErrors。在那里我们注意到:
我们在几个域上对此进行了测试,错误总是如上所列。但是,这些域提供的证书(您也可以在ServerCertificateValidationCallback
中看到)都是正确有效的。
我只能假设它们有效,因为较旧的应用仍然可以连接,因为在浏览器中打开这些网址表示证书很好,并且因为SSL Labs等测试工具为这些域提供了大量的A / A +
谷歌搜索发现了一些建议改变我们使用的HTTP API的帖子。但是,连接到WCF服务器的代码是使用带有ServiceModel.ClientBase
的{{1}}自动生成的Web引用。我不知道它在底层使用了什么HTTP API,我不认为我们可以轻松地改变它。无论如何,我认为这应该是开箱即用的,就像它在更新之前一样。
在此Xamarin发布周期中,TLS API发生了一些变化。其他一些Xaramin论坛帖子建议更改iOS构建选项 SSL / TLS实现和 HttpClient实现。我们尝试了几种这些排列,但它们都会产生相同的错误。我们尝试使用Android HttpClient Implementation 设置。没有结果。
因此暂时关闭证书验证:
BasicHttpBinding
还有其他人遇到这个吗?有人有解决方案吗?我们做错了吗?
这是Mono.Security中的错误。有关官方错误报告,请参阅here。
答案 0 :(得分:1)
对于交叉引用,现在已经为此“从服务器收到的证书无效”问题提交了一个错误,供Mono团队调查:https://bugzilla.xamarin.com/show_bug.cgi?id=44708。
此错误会影响Mono,Xamarin.Android,Xamarin.iOS和Xamarin.Mac。
答案 1 :(得分:0)
Xamarin.iOS版本:10.0.0.6哈希:6c3fee4分支:xcode8
托管的HttpClient提供程序已被破坏(再次)。
在iOS Build下,更改 HttpClient implementation
:
Managed (default)
NSUrlSession (iOS 7+)
var webView = new WKWebView(new CGRect(40, 100, 400, 400), new WKWebViewConfiguration());
Add(webView);
var button = new UIButton(UIButtonType.System);
button.Frame = new CGRect(40, 40, 100, 40);
Add(button);
button.SetTitle("Fetch", UIControlState.Normal);
button.TouchUpInside += async (object sender, EventArgs e) =>
{
var client = new HttpClient();
var response = await client.GetAsync("https://sni.velox.ch");
webView.LoadHtmlString(new NSString(await response.Content.ReadAsStringAsync()), new NSUrl(""));
};
Managed Provider
TlsException: The authentication or decryption has failed.
NSUrlSession (iOS 7+)
(Successful url fetch)