Wcf Xamarin第8周期中SSL证书验证失败(在Android和iOS上)
我们最近将Xamarin工具更新为 在更新后执行的例行测试中,我们很快注意到,对基于WCF的服务器组件的所有HTTPS请求都失败了。我们仍然有旧版本的设备,它们工作正常。新编译的版本都无法连接 连接异常总是归结为一个Wcf Xamarin第8周期中SSL证书验证失败(在Android和iOS上),wcf,ssl,xamarin,Wcf,Ssl,Xamarin,我们最近将Xamarin工具更新为 在更新后执行的例行测试中,我们很快注意到,对基于WCF的服务器组件的所有HTTPS请求都失败了。我们仍然有旧版本的设备,它们工作正常。新编译的版本都无法连接 连接异常总是归结为一个Mono.Security.Protocol.Tls.TlsException表示从服务器收到的无效证书(错误代码:0xFFFFFF800B010F) 调查 为了进行调查,我们定义了一个。在那里,我们注意到: 在Android上,我们总是得到SslPolicyErrors.Remo
Mono.Security.Protocol.Tls.TlsException
表示从服务器收到的无效证书(错误代码:0xFFFFFF800B010F)
调查
为了进行调查,我们定义了一个。在那里,我们注意到:
- 在Android上,我们总是得到SslPolicyErrors.RemoteCertificateMatch
- 在iOS上,我们总是得到SslPolicyErrors.RemoteCertificateChaineErrors
服务器CertificateValidationCallback
中看到)都是正确有效的
我只能假设它们是有效的,因为旧的应用程序仍然可以连接,因为在浏览器中打开这些URL表示证书是可以的,并且因为测试工具(例如,为这些域提供a/a+分数)
我们尝试了什么
谷歌搜索发现了一些建议更改我们使用的HTTP API的帖子。但是,连接到WCF服务器的代码是使用ServiceModel.ClientBase
和BasicHttpBinding
自动生成的web引用。我不知道这在幕后使用的是什么HTTP API,而且我认为我们不能轻易地改变它。无论如何,我认为这应该是开箱即用的,就像在更新之前一样
在这个Xamarin发布周期中,TLS API发生了一些变化。其他一些Xaramin论坛帖子建议更改iOS构建选项SSL/TLS实现和HttpClient实现。我们尝试了几种排列方式,但都产生了相同的错误。我们在Android HttpClient实现设置中也尝试了同样的方法。没有结果
变通办法
因此,我们暂时关闭了证书验证:
ServicePointManager.ServerCertificateValidationCallback += () =>
{
return true;
};
还有其他人经历过这种情况吗?有人有解决办法吗?我们做错什么了吗
编辑
这是Mono.Security中的一个bug。有关官方错误报告,请参阅
Xamarin.iOS版本:10.0.0.6散列:6c3fee4分支:xcode8
托管HttpClient提供程序已断开(再次)
解决方法:
在iOS构建下,更改您的HttpClient实现:
- 从
Managed(默认)
- 至NSUrlSession(iOS 7+)
托管提供商
:
NSUrlSession(iOS 7+)
:
为了进行交叉引用,Mono团队现已针对“从服务器收到的无效证书”问题提交了一个bug,以供调查:
此错误会影响Mono、Xamarin.Android、Xamarin.iOS和Xamarin.Mac。我有与上面发布的问题和解决方法完全相同的问题,仅在升级后才会发生。目前正在研究其他解决办法。我正在使用现代HttpClient。
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(""));
};
TlsException: The authentication or decryption has failed.
(Successful url fetch)