2009-04-06 21 views
5

Bien estoy trabajando contra un servicio web que tiene un certificado que no está configurado al 100% correctamente. El certificado está configurado para el dominio * .domain1.com y la API se encuentra en soap.shop.domain1.com/SOAP ahora no puedo conectar a este servicio web ya que luego obtengo una WebException "No se pudo establecer la relación de trush para el canal seguro SSL/TLS. -> El certificado remoto no es válido según el procedimiento de validación.Net WebService, bypass ssl validation!

Ahora mi pregunta es si hay alguna forma de omitir este control, utilizo una referencia web normal (2.0) no una referencia de servicio.

Respuesta

6

sí, se puede usar lo siguiente para tener ASP.NET caso omiso de las advertencias de certificado:

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

Para aquellos que no pueden determinar por dónde empezar con esta respuesta, puede no ser obvio Los carteles de arriba lo están haciendo bien, pero no fue aparente desde el principio sobre qué hacer con el código dado.

Digamos que tiene una clase en algún lugar que necesita llamar a un servicio web con un certificado.

aquí está mi solución final:

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

tienes que elegir el sabor ..

expresiones lambda

  //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")); 

o simple clode (mejores para las pruebas)

  // 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

esto es genial, me gusta el "más seguro" ¡Opción también para verificar que el certificado esté remotamente cerca! –