2010-09-09 76 views
2

我試圖將現有的應用程序移植到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但總是相同的錯誤,實現單同樣沒有

回答

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; 
    } 
} 
} 
+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

3

的主要原因是單聲道,不像微軟的.NET實現,不包含受信任的根證書,因此所有證書驗證都將默認失敗。

本頁做了一個很好的工作,解釋了Mono上的證書驗證如何工作。它還介紹如何負責任地實施自己的政策,包括示例代碼。

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

該網站是有些舊,並且提供代碼.NET 2.0,使用ServicePointManager.CertificatePolicy屬性。您應該使用較新的,未棄用的ServicePointManager.ServerCertificateValidationCallback屬性。