Permitir certificados SSL que no son de confianza con HttpClient

Resuelto Jamie asked hace 12 años • 13 respuestas

Estoy luchando para que mi aplicación de Windows 8 se comunique con mi API web de prueba a través de SSL.

Parece que HttpClient/HttpClientHandler no proporciona una opción para ignorar certificados que no son de confianza como le permite WebRequest (aunque de una manera "pirata" con ServerCertificateValidationCallback).

¡Cualquier ayuda sería muy apreciada!

Jamie avatar Sep 23 '12 21:09 Jamie
Aceptado

Una solución rápida y sucia es utilizar el ServicePointManager.ServerCertificateValidationCallbackdelegado. Esto le permite proporcionar su propia validación de certificado. La validación se aplica globalmente en todo el dominio de la aplicación.

ServicePointManager.ServerCertificateValidationCallback +=
    (sender, cert, chain, sslPolicyErrors) => true;

Utilizo esto principalmente para pruebas unitarias en situaciones en las que quiero ejecutarlo en un punto final que estoy alojando en proceso y estoy intentando acceder a él con un cliente WCF o el archivo HttpClient.

Para el código de producción, es posible que desee un control más detallado y sería mejor utilizar WebRequestHandlery su ServerCertificateValidationCallbackpropiedad delegada (consulte la respuesta de dtb a continuación ). O agregue la respuesta usando el archivo HttpClientHandler. Ahora prefiero cualquiera de estos dos, incluso con mis pruebas de integración, a cómo solía hacerlo, a menos que no pueda encontrar ningún otro gancho.

Bronumski avatar Aug 14 '2013 12:08 Bronumski

Si está intentando hacer esto en una biblioteca .NET Standard, aquí tiene una solución simple, con todos los riesgos de simplemente regresar trueen su controlador. La seguridad la dejo a usted.

var handler = new HttpClientHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.ServerCertificateCustomValidationCallback = 
    (httpRequestMessage, cert, cetChain, policyErrors) =>
{
    return true;
};

var client = new HttpClient(handler);
ctacke avatar Oct 08 '2017 01:10 ctacke

Eche un vistazo a la clase WebRequestHandler y su propiedad ServerCertificateValidationCallback :

using (var handler = new WebRequestHandler())
{
    handler.ServerCertificateValidationCallback = ...

    using (var client = new HttpClient(handler))
    {
        ...
    }
}
dtb avatar Sep 23 '2012 16:09 dtb