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 los certificados que no son de confianza, como te permite WebRequest (aunque de una manera "pirata" ServerCertificateValidationCallback
).
¡Cualquier ayuda será muy apreciada!
c#
.net
windows-8
windows-runtime
Jamie
fuente
fuente
Respuestas:
Con Windows 8.1, ahora puede confiar en certificados SSL no válidos. Tiene que usar Windows.Web.HttpClient o si desea usar System.Net.Http.HttpClient, puede usar el adaptador de controlador de mensajes que escribí: http://www.nuget.org/packages/WinRtHttpClientHandler
Los documentos están en GitHub: https://github.com/onovotny/WinRtHttpClientHandler
fuente
Una solución rápida y sucia es utilizar al
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.Utilizo esto principalmente para pruebas unitarias en situaciones en las que quiero ejecutar un punto final que estoy alojando en proceso y estoy tratando de conectarlo con un cliente WCF o el
HttpClient
.Para el código de producción, es posible que desee un control más detallado y sería mejor usar la propiedad
WebRequestHandler
y suServerCertificateValidationCallback
delegado (consulte la respuesta de dtb a continuación ). O ctacke responde usando elHttpClientHandler
. Prefiero cualquiera de estos dos ahora, incluso con mis pruebas de integración, sobre cómo solía hacerlo, a menos que no pueda encontrar ningún otro gancho.fuente
ServicePointManager.GetServicePoint(Uri)
(ver documentos ) para obtener el punto de servicio que se aplica solo a las llamadas a ese URI. Luego puede establecer propiedades y manejar eventos basados en ese subconjunto.Eche un vistazo a la clase WebRequestHandler y su propiedad ServerCertificateValidationCallback :
fuente
derived class
?HttpClientHandler
?Si está intentando hacer esto en una biblioteca .NET Standard, aquí tiene una solución simple, con todos los riesgos de regresar
true
en su controlador. Dejo la seguridad en tus manos.fuente
O puede usar para HttpClient en el
Windows.Web.Http
espacio de nombres:fuente
System.Net.Http
,System.Web
yWindows.Web.Http
juntos?Si está utilizando
System.Net.Http.HttpClient
, creo que el patrón correcto esfuente
La mayoría de las respuestas aquí sugieren usar el patrón típico:
debido a la interfaz IDisposable. ¡Por favor no lo hagas!
Microsoft te dice por qué:
Y aquí puede encontrar un análisis detallado de lo que sucede detrás de escena: https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
Con respecto a su pregunta sobre SSL y basado en https://docs.microsoft.com/en-us/azure/architecture/antipatterns/improper-instantiation/#how-to-fix-the-problem
Aquí está tu patrón:
fuente
Si se trata de una aplicación de Windows Runtime, debe agregar el certificado autofirmado al proyecto y hacer referencia a él en el archivo appxmanifest.
Los documentos están aquí: http://msdn.microsoft.com/en-us/library/windows/apps/hh465031.aspx
Lo mismo ocurre si es de una CA que no es de confianza (como una CA privada en la que la máquina no confía): debe 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.
fuente
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 Win8 de desarrollo estará bien.
Para habilitar el cifrado HTTPS en Fiddler2, vaya a Herramientas> Opciones de Fiddler> HTTPS (pestaña)> Marque "Descifrar tráfico HTTPS" .
Voy a estar atento a este hilo esperando que alguien tenga una solución elegante.
fuente
Encontré un ejemplo en este cliente de Kubernetes en el que estaban usando X509VerificationFlags.AllowUnknownCertificateAuthority para confiar en certificados raíz autofirmados y autofirmados. Modifiqué ligeramente su ejemplo para trabajar con nuestros propios certificados raíz codificados en PEM. Ojalá esto ayude a alguien.
fuente
Encontré un ejemplo en línea que parece funcionar bien:
Primero crea una nueva ICertificatePolicy
Luego, use esto antes de enviar su solicitud http así:
http://www.terminally-incoherent.com/blog/2008/05/05/send-a-https-post-request-with-c/
fuente
ServicePointManager.CertificatePolicy
está en desuso: docs.microsoft.com/en-us/dotnet/framework/whats-new/…