2009-04-06 10 views
5

Bien que je travaille avec un service web qui a un certificat qui n'est pas configuré correctement à 100%, le certificat est configuré pour le domaine * .domaine1.com et l'API se trouve à soap.shop.domain1.com/SOAP maintenant je ne peux pas me connecter Je reçois alors une exception WebException "Impossible d'établir une relation trush pour le canal sécurisé SSL/TLS." -> Le certificat à distance est invalide selon la procédure de validation.net WebService, contournement de la validation ssl!

Maintenant, ma question est de savoir comment contourner cette vérification j'utilise un Web référence normale (2.0) pas une référence de service ..

Répondre

6

Oui, vous pouvez utiliser ce qui suit pour avoir ASP.NET ignorer les avertissements de certificat:

using System; 
using System.Net; 
using System.Security.Cryptography.X509Certificates; 

namespace YourNamespace 
    public class TrustAllCertificatePolicy : System.Net.ICertificatePolicy 
    { 
     public TrustAllCertificatePolicy() {} 

     public bool CheckValidationResult(ServicePoint sp, X509Certificate cert,WebRequest req, int problem) 
     { 
      return true; 
     } 
    } 
} 
5
System.Net.ServicePointManager.ServerCertificateValidationCallback = _ 
    Function(a, b, c, d) True 
8

Pour ceux qui ne peuvent pas déterminer où commencer avec cette réponse, Ce n'est peut-être pas évident. Les affiches ci-dessus sont bien faites, mais il n'était pas évident à l'avance sur ce qu'il faut faire avec le code donné. Supposons que vous ayez une classe quelque part qui doit appeler un service Web avec un certificat.

Voilà ma solution finie:

public class MyClass 
{ 

    public bool TrustAllCertificatesCallback(object sender, X509Certificate cert, 
               X509Chain chain, SslPolicyErrors errors) 
    { 
     return true; 
    } 

    public string CallSomeWebService(string someParam) 
    { 
     try 
     { 
      ServicePointManager.ServerCertificateValidationCallback = TrustAllCertificatesCallback; 


      RemoteWebService ws = new RemoteWebService(); 

      //add the client cert to the web service call. 
      ws.ClientCertificates.Add(GetMyCert()); 

      //call the web service 
      string response = ws.SomeMethod(someParam); 

      return response.ToString(); 
     } 
     catch (Exception ex) 
     {throw;} 
    } 

    public X509Certificate GetMyCert() 
    { 
     try 
     { 
      string certPath = @"C:\MyCerts\MyCert.cer"; 
      var cert = X509Certificate.CreateFromCertFile(certPath); 
      return cert; 
     } 
     catch (Exception ex) 
     {throw;} 
    } 
} 
4

vous chercher goût ..

lambda expresions

  //Trust all certificates 
      System.Net.ServicePointManager.ServerCertificateValidationCallback = 
       ((sender, certificate, chain, sslPolicyErrors) => true); 

      // trust sender (more secure) 
      System.Net.ServicePointManager.ServerCertificateValidationCallback 
       = ((sender, cert, chain, errors) => cert.Subject.Contains("YourServerName")); 

ou clode plaine (mieux pour les tests)

  // validate cert 
      // allows for validation of SSL conversations 
      ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate); 

    // callback used to validate the certificate in an SSL conversation 
    private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors) 
    { 
     bool result = false; 
     if (cert.Subject.ToUpper().Contains("YourServerName")) 
     { 
      result = true; 
     } 

     return result; 
    } 
+0

Il s'agit super, j'aime le "plus sécurisé" option aussi bien pour vérifier que le cert peut être à distance! –

Questions connexes