Permitir certificados SSL que no son de confianza con HttpClient
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!
Una solución rápida y sucia es utilizar el ServicePointManager.ServerCertificateValidationCallback
delegado. 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 WebRequestHandler
y su ServerCertificateValidationCallback
propiedad 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.
Si está intentando hacer esto en una biblioteca .NET Standard, aquí tiene una solución simple, con todos los riesgos de simplemente regresar true
en 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);
Eche un vistazo a la clase WebRequestHandler y su propiedad ServerCertificateValidationCallback :
using (var handler = new WebRequestHandler())
{
handler.ServerCertificateValidationCallback = ...
using (var client = new HttpClient(handler))
{
...
}
}