2010-09-09 6 views
2

J'essaie de porter une application existante vers Mono 2.6.7/Linux. Une tâche consiste à recevoir des données via la méthode WebClient à partir des serveurs avec un invalide SSL Cert.Mono, WebClient et certificats SSL invalides

Notre .Net 3.5 code sous Windows pour accepter tous les certificats fonctionne très bien:

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

J'ai essayé divers. les choses pour atteindre le même en Mono sans en utilisant Mono dll de spécifiques, mais toujours la même erreur:

Error getting response stream (Write: The authentication or decryption has failed.): SendFailure

Toute idée comment résoudre ce problème?

Répondre

2

Essayez d'utiliser cette place (la propriété de rappel a été mis en œuvre que récemment, je pense):

ServicePointManager.CertificatePolicy = new NoCheckCertificatePolicy(); 

NoCertificatePolicy est:

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

Note de mise en garde: Veuillez NE PAS mettre ce code en production. Cela ressemble à l'introduction de la même vulnérabilité de sécurité sévère qui a été récemment trouvée dans iOS et MacOS: http://www.neowin.net/news/serious-vulnerability-found-in-ssltls-on-os-x-mavericks-and -ios-7-facilement-exploitable – dotMorten

3

La raison principale est que Mono, contrairement à l'implémentation .NET de Microsoft , n'inclut pas les certificats racine approuvés, donc toute validation de certificat échouera par défaut.

Cette page explique parfaitement comment fonctionne la validation de certificat sur Mono. Il décrit également comment implémenter votre propre politique de manière responsable, y compris un exemple de code.

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

Le site est un peu vieux et fournit le code pour .NET 2.0, en utilisant la propriété ServicePointManager.CertificatePolicy. Vous devez utiliser la propriété ServicePointManager.ServerCertificateValidationCallback plus récente et non obsolète à la place.

Questions connexes