2008-09-20 12 views
80

Estamos configurando un nuevo SharePoint para el que todavía no tenemos un certificado SSL válido. Me gustaría llamar al servicio web Listas para recuperar algunos metadatos sobre la configuración. Sin embargo, cuando trato de hacer esto, tengo la excepción:Evite errores de certificados SSL no válidos al llamar a servicios web en .Net

The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.

La excepción anidada contiene el mensaje de error:

The remote certificate is invalid according to the validation procedure.

Esto es correcto ya que estamos utilizando un certificado temporal.

Mi pregunta es: ¿cómo puedo decirle al cliente de servicios web .Net (SoapHttpClientProtocol) hacer caso omiso de estos errores?

Respuesta

17

El enfoque que utilicé al enfrentar este problema fue agregar al firmante del certificado temporal a la lista de autoridades de confianza en la computadora en cuestión.

Normalmente hago pruebas con certificados creados con CACERT, y agregarlos a mi lista de autoridades de confianza funcionó a la perfección.

Hacerlo de esta manera significa que no tiene que agregar ningún código personalizado a su aplicación y simula correctamente lo que sucederá cuando se implemente su aplicación. Como tal, creo que esta es una solución superior para desactivar el control mediante programación.

+0

Esa fue mi primera idea también. Lamentablemente, el certificado también ha caducado, por lo que es imposible hacerlo confiable. –

+0

¿Hay alguna razón por la que no pueda usar a alguien como CA cert? Si es un certificado de prueba, entonces podría continuar con eso. ¡No estoy seguro de si hay alguna manera de desactivar estos cheques! –

107

Alternativamente se puede registrar una llamada de vuelta delegado que ignora el error de certificación:

... 
ServicePointManager.ServerCertificateValidationCallback = MyCertHandler; 
... 

static bool MyCertHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors error) 
{ 
// Ignore errors 
return true; 
} 
+1

Agregué este método estático a global.asax y configuré el evento en "OnApplicationStart". trabajado como un encanto. Gracias –

+1

@JuanZamora Hice lo mismo que tú. ¡Funcionó! –

+3

Esto es todo lo que necesita hacer, si quiere ser vulnerable al ataque * "Man in the Middle" * ... – Houtman

71

Al igual que la respuesta de Jason S:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

pongo esto en mi principal y buscar a mi app.config y la prueba si (ConfigurationManager.AppSettings["IgnoreSSLCertificates"] == "True") antes de llamar a esa línea de código.

20

He resuelto de esta manera:

llamar al siguiente justo antes de llamar al servicio web SSL que causan que el error:

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

/// <summary> 
/// solution for exception 
/// System.Net.WebException: 
/// The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure. 
/// </summary> 
public static void BypassCertificateError() 
{ 
    ServicePointManager.ServerCertificateValidationCallback += 

     delegate(
      Object sender1, 
      X509Certificate certificate, 
      X509Chain chain, 
      SslPolicyErrors sslPolicyErrors) 
     { 
      return true; 
     }; 
} 
+3

+1 para agregar los usos y espacios de nombres :) –

+1

Holy% @ # $! ¡Me salvaste la vida con esto! GRACIAS imanbidi !! –

0

Para los novatos, puede extender su clase de servicio parcial en un cs separada archivo y agregue el código el código proporcionado por "imanabidi" para integrarlo

10

Estaba teniendo el mismo error al utilizar DownloadString; y fue capaz de hacer que funciona de la siguiente manera con las sugerencias de esta página

System.Net.WebClient client = new System.Net.WebClient();    
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 
string sHttpResonse = client.DownloadString(sUrl); 
2
ServicePointManager.ServerCertificateValidationCallback += 
      (mender, certificate, chain, sslPolicyErrors) => true; 

pasará por alto ssl invaild. Escríbelo en el constructor de tu servicio web.

1

Para ampliar aún más la publicación de Simon Johnsons: lo ideal es que quieras una solución que simule las condiciones que verás en la producción y modificar tu código no hará eso y podría ser peligroso si te olvidas de sacar el código. desplegarlo.

Necesitará un certificado autofirmado de algún tipo. Si está utilizando IIS Express ya tendrá uno de estos, solo tendrá que encontrarlo. Abra Firefox o el navegador que desee e ingrese a su sitio web de desarrollo.Debería poder ver la información del certificado desde la barra de URL y, dependiendo de su navegador, debería poder exportar el certificado a un archivo.

A continuación, abra MMC.exe y agregue el complemento Certificado. Importe su archivo de certificado en la tienda Autoridades de certificación de raíz de confianza y eso es todo lo que necesita. Es importante asegurarse de que vaya a esa tienda y no a otra tienda como 'Personal'. Si no está familiarizado con MMC o certificados, hay numerosos sitios web con información sobre cómo hacer esto.

Ahora, su computadora como un todo confiará implícitamente en cualquier certificado que se haya generado y no necesitará agregar código para manejar esto especialmente. Cuando pase a producción, continuará funcionando siempre que tenga un certificado válido instalado allí. No haga esto en un servidor de producción; sería malo y no funcionaría para ningún otro cliente que no sea el servidor.

Cuestiones relacionadas