Mono,WebClient&无效的SSL证书

时间:2010-09-09 07:49:20

标签: c# ssl mono

我正在尝试将现有的应用程序移植到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

有任何想法如何解决这个问题?

2 个答案:

答案 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;
  }
 }
}