【问题标题】:Mono, WebClient & invalid SSL CertificatesMono、WebClient 和无效 SSL 证书
【发布时间】:2011-04-10 03:15:37
【问题描述】:

我正在尝试将现有应用程序移植到 Mono 2.6.7/Linux。 一项任务是通过 WebClient 方法从具有 invalid 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;
}

我试过杂项。在 Mono 没有使用特定的 Mono dll 实现相同但总是相同的错误:

获取响应流时出错(写: 认证或解密有 失败。):发送失败

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

【问题讨论】:

    标签: c# ssl mono


    【解决方案1】:

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

    这个页面很好地解释了 Mono 上的证书验证是如何工作的。它还介绍了如何负责任地实施您自己的政策,包括示例代码。

    http://www.mono-project.com/UsingTrustedRootsRespectfully

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

    【讨论】:

      【解决方案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;
        }
       }
      }
      

      【讨论】:

      • 注意事项:请不要将此代码投入生产。这类似于引入最近在 iOS 和 MacOS 中发现的同样严重的安全漏洞:neowin.net/news/…
      猜你喜欢
      • 1970-01-01
      • 2017-04-28
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 2020-06-26
      • 2021-07-13
      • 1970-01-01
      • 2014-06-13
      相关资源
      最近更新 更多