单声道,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; 
    } 
} 
} 
+2

注意事项:请不要将此代码投入生产。这类似于引入了最近在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

的主要原因是单声道,不像微软的.NET实现,不包含受信任的根证书,因此所有证书验证都将默认失败。

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

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

该网站是有些旧,并且提供代码.NET 2.0,使用ServicePointManager.CertificatePolicy属性。您应该使用较新的,未弃用的ServicePointManager.ServerCertificateValidationCallback属性。