C# Mono、WebClient&;无效的SSL证书
我正在尝试将现有应用程序移植到Mono 2.6.7/Linux。 一项任务是通过WebClient方法从具有无效的SSL证书的服务器接收数据 我们在Windows下的.Net 3.5代码可以接受所有证书: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)); ...
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;
}
}
}