C# Mono、WebClient&;无效的SSL证书

C# Mono、WebClient&;无效的SSL证书,c#,ssl,mono,C#,Ssl,Mono,我正在尝试将现有应用程序移植到Mono 2.6.7/Linux。 一项任务是通过WebClient方法从具有无效的SSL证书的服务器接收数据 我们在Windows下的.Net 3.5代码可以接受所有证书: ServicePointManager.ServerCertificateValidationCallback = TrustCertificate; StreamReader webReader = new StreamReader(webClient.OpenRead(url)); ...

我正在尝试将现有应用程序移植到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中实现相同的功能,而不使用特定的Mono dll,但始终存在相同的错误:

获取响应流时出错(写入: 验证或解密已完成 失败。):发送失败

有什么办法解决这个问题吗?

试着改用它(我想回调属性是最近才实现的):

其中,
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;
  }
 }
}

主要原因是Mono与Microsoft的.NET实现不同,它不包括受信任的根证书,因此默认情况下所有证书验证都将失败

本页非常好地解释了Mono上的证书验证是如何工作的。它还描述了如何负责任地实现您自己的策略,包括示例代码


该站点有些陈旧,使用
ServicePointManager.CertificatePolicy
属性为.NET 2.0提供代码。您应该使用更新的、未弃用的
ServicePointManager.ServerCertificateValidationCallback
属性。

注意:请不要将此代码投入生产。这类似于引入最近在iOS和MacOS中发现的同样严重的安全漏洞:
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;
  }
 }
}