Omita errores de certificados SSL no válidos al llamar a servicios web en .Net


88

Estamos configurando un nuevo SharePoint para el que aún no tenemos un certificado SSL válido. Me gustaría llamar al servicio web Lists para recuperar algunos metadatos sobre la configuración. Sin embargo, cuando intento hacer esto, obtengo la excepción:

Se cerró la conexión subyacente: no se pudo establecer una relación de confianza para el canal seguro SSL / TLS.

La excepción anidada contiene el mensaje de error:

El certificado remoto no es válido según el procedimiento de validación.

Esto es correcto ya que estamos usando un certificado temporal.

Mi pregunta es: ¿cómo puedo decirle al cliente de servicio web .Net ( SoapHttpClientProtocol ) que ignore estos errores?

Respuestas:


18

El enfoque que utilicé cuando me enfrenté a este problema fue agregar al firmante del certificado temporal a la lista de autoridades confiables 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 adecuadamente lo que sucederá cuando se implemente su aplicación. Como tal, creo que esta es una solución superior para desactivar la verificación mediante programación.


Esa fue también mi primera idea. Lamentablemente, el certificado también ha caducado, por lo que es imposible conseguir que sea de confianza.
ene.vdbergh

¿Hay alguna razón por la que no pueda utilizar a alguien como CA cert? Si es un certificado de prueba, entonces puede seguir adelante con eso. ¡No estoy seguro de si hay una manera de desactivar estos controles!
Simon Johnson

113

Alternativamente, puede registrar un delegado de devolución de llamada 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 al global.asax y configuré el evento en "OnApplicationStart". trabajado como un encanto. Gracias
Juan Zamora

1
@JuanZamora Hice lo mismo que tú. ¡Funcionó!
Sachin BR

5
Esto es todo lo que necesita hacer, si quiere ser vulnerable al ataque del "Hombre en el medio" ...
Houtman

2
Idealmente, solo debería hacer esto en un entorno de desarrollo.
Ron DeFreitas

79

Como la respuesta de Jason S:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

Pongo esto en mi Main y miro app.configy pruebo si (ConfigurationManager.AppSettings["IgnoreSSLCertificates"] == "True")antes de llamar a esa línea de código.


24

Lo resolví de esta manera:

Llame a lo siguiente justo antes de llamar a su servicio web ssl que causa ese 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;
        };
}

12

Estaba teniendo el mismo error al usar DownloadString; y pude hacer que funcione como se muestra a continuación con sugerencias en esta página

System.Net.WebClient client = new System.Net.WebClient();            
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
string sHttpResonse = client.DownloadString(sUrl);

3
ServicePointManager.ServerCertificateValidationCallback +=
            (mender, certificate, chain, sslPolicyErrors) => true;

omitirá invaild ssl. Escríbalo a su constructor de servicios web.


1

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


1

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

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 y vaya 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 a la tienda Trusted Root Certificate Authorities y eso es todo lo que necesita. Es importante asegurarse de que entre en esa tienda y no en otra tienda como 'Personal'. Si no está familiarizado con MMC o certificados, existen numerosos sitios web con información sobre cómo hacerlo.

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.