Permitir certificados SSL no confiables con HttpClient

Estoy luchando para que mi aplicación 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 los certificados que no son de confianza, como WebRequest le permite (aunque de una manera “hacky” con ServerCertificateValidationCallback ).

¡Cualquier ayuda sería muy apreciada!

Con Windows 8.1, ahora puede confiar en certificados SSL no válidos. Debe usar Windows.Web.HttpClient o si desea usar System.Net.Http.HttpClient, puede usar el adaptador de manejador de mensajes que escribí: http://www.nuget.org/packages/WinRtHttpClientHandler

Los documentos están en GitHub: https://github.com/onovotny/WinRtHttpClientHandler

Una solución rápida y sucia es usar el delegado ServicePointManager.ServerCertificateValidationCallback . Esto le permite proporcionar su propia validación de certificado. La validación se aplica globalmente en todo el Dominio de aplicaciones.

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

Utilizo esto principalmente para pruebas unitarias en situaciones en las que quiero correr contra un punto final que estoy hospedando en proceso y estoy tratando de alcanzarlo con un cliente WCF o 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 propiedad delegada ServerCertificateValidationCallback (consulte la respuesta de dtb a continuación ). O ctacke responde usando HttpClientHandler . Estoy prefiriendo cualquiera de estos dos ahora incluso con mis pruebas de integración sobre cómo solía hacerlo a menos que no pueda encontrar otro gancho.

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

 using (var handler = new WebRequestHandler()) { handler.ServerCertificateValidationCallback = ... using (var client = new HttpClient(handler)) { ... } } 

O puede usar para HttpClient en el espacio de nombres Windows.Web.Http :

 var filter = new HttpBaseProtocolFilter(); #if DEBUG filter.IgnorableServerCertificateErrors.Add(ChainValidationResult.Expired); filter.IgnorableServerCertificateErrors.Add(ChainValidationResult.Untrusted); filter.IgnorableServerCertificateErrors.Add(ChainValidationResult.InvalidName); #endif using (var httpClient = new HttpClient(filter)) { ... } 

Si está intentando hacer esto en una biblioteca .NET Standard, aquí hay una solución simple, con todos los riesgos de solo devolver true en su controlador. Te dejo la seguridad a ti.

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

Si esto es para una aplicación de Windows Runtime, entonces debe agregar el certificado autofirmado al proyecto y hacer referencia a él en el appxmanifest.

Los documentos están aquí: http://msdn.microsoft.com/en-us/library/windows/apps/hh465031.aspx

Lo mismo si es de una CA que no es de confianza (como una CA privada en la que la máquina no confía): necesita obtener el certificado público de la CA, agregarlo como contenido a la aplicación y luego agregarlo al manifiesto.

Una vez hecho esto, la aplicación lo verá como un certificado firmado correctamente.

No tengo una respuesta, pero tengo una alternativa.

Si usa Fiddler2 para monitorear el tráfico Y habilita el descifrado HTTPS, su entorno de desarrollo no se quejará. Esto no funcionará en dispositivos WinRT, como Microsoft Surface, porque no puede instalar aplicaciones estándar en ellos. Pero su computadora de desarrollo Win8 estará bien.

Para habilitar el cifrado HTTPS en Fiddler2, vaya a Herramientas> Opciones de Fiddler> HTTPS (Pestaña)> Verificar “Descifrar el tráfico HTTPS” .

Voy a vigilar este hilo esperando que alguien tenga una solución elegante.

Encontré un ejemplo en línea que parece funcionar bien:

Primero creas un nuevo ICertificatePolicy

 using System.Security.Cryptography.X509Certificates; using System.Net; public class MyPolicy : ICertificatePolicy { public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem) { //Return True to force the certificate to be accepted. return true; } } 

Luego solo use esto antes de enviar su solicitud http de la siguiente manera:

 System.Net.ServicePointManager.CertificatePolicy = new MyPolicy(); 

http://www.terminally-incoherent.com/blog/2008/05/05/send-a-https-post-request-with-c/