单声道,Web客户端和无效的SSL证书
问题描述:
我试图将现有的应用程序移植到Mono 2.6.7/Linux。 一项任务是通过服务器上的WebClient方法接收数据,其中无效的 SSL证书。单声道,Web客户端和无效的SSL证书
我们的.Net 3.5的Windows下的代码以接受所有证书工作正常:
ServicePointManager.ServerCertificateValidationCallback = TrustCertificate;
StreamReader webReader = new StreamReader(webClient.OpenRead(url));
...
private static bool TrustCertificate(object sender, X509Certificate x509Certificate, X509Chain x509Chain, SslPolicyErrors sslPolicyErrors)
{
// all Certificates are accepted
return true;
}
我试过杂项。
Error getting response stream (Write: The authentication or decryption has failed.): SendFailure
任何想法如何来解决这个问题:使用的东西具体单声道的dll但总是相同的错误,实现单同样没有?
答
尝试使用这个代替(回调财产只执行最近我想):
ServicePointManager.CertificatePolicy = new NoCheckCertificatePolicy();
其中NoCertificatePolicy
是:
using System;
using System.Net;
using System.Security.Cryptography.X509Certificates;
namespace MyNameSpace
{
class NoCheckCertificatePolicy : ICertificatePolicy
{
public bool CheckValidationResult (ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem)
{
return true;
}
}
}
答
的主要原因是单声道,不像微软的.NET实现,不包含受信任的根证书,因此所有证书验证都将默认失败。
本页做了一个很好的工作,解释了Mono上的证书验证如何工作。它还介绍如何负责任地实施自己的政策,包括示例代码。
http://www.mono-project.com/UsingTrustedRootsRespectfully
该网站是有些旧,并且提供代码.NET 2.0,使用ServicePointManager.CertificatePolicy
属性。您应该使用较新的,未弃用的ServicePointManager.ServerCertificateValidationCallback
属性。
注意事项:请不要将此代码投入生产。这类似于引入了最近在iOS和MacOS中发现的同样严重的安全漏洞:http://www.neowin.net/news/serious-vulnerability-found-in-ssltls-on-os-x-mavericks-and -ios -7-易利用的 – dotMorten 2014-09-02 00:19:30