我正在尝试将现有的应用程序移植到Mono 2.6.7 / Linux。 一项任务是通过WebClient方法从具有无效 SSL证书的服务器接收数据。
我们在Windows下的.Net 3.5代码接受所有证书的工作正常:
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;
}
我试过misc。在单声道没有使用特定的Mono dll但是总是同样的错误时实现相同的事情:
获取响应流时出错(写入: 验证或解密具有 失败。):SendFailure
有任何想法如何解决这个问题?
答案 0 :(得分:4)
主要原因是,与Microsoft的.NET实现不同,Mono不包含受信任的根证书,因此默认情况下所有证书验证都将失败。
此页面可以很好地解释Mono上的证书验证是如何工作的。它还描述了如何负责任地实施自己的策略,包括示例代码。
http://www.mono-project.com/UsingTrustedRootsRespectfully
该网站有些陈旧,使用ServicePointManager.CertificatePolicy
属性为.NET 2.0提供代码。您应该使用较新的,不推荐使用的ServicePointManager.ServerCertificateValidationCallback
属性。
答案 1 :(得分:2)
尝试使用它(回调属性最近才实现):
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;
}
}
}