He estado usando HttpClient
para hacer llamadas WebApi usando C #. Parece ordenado y rápido en comparación con WebClient
. Sin embargo, estoy atrapado mientras hago Https
llamadas.
¿Cómo puedo hacer el siguiente código para hacer Https
llamadas?
HttpClient httpClient = new HttpClient();
httpClient.BaseAddress = new Uri("https://foobar.com/");
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/xml"));
var task = httpClient.PostAsXmlAsync<DeviceRequest>(
"api/SaveData", request);
EDITAR 1: El código anterior funciona bien para hacer llamadas http. Pero cuando cambio el esquema a https, no funciona. Aquí está el error obtenido:
Se cerró la conexión subyacente: no se pudo establecer una relación de confianza para el canal seguro SSL / TLS.
EDITAR 2: Cambiar el esquema a https es: paso uno.
¿Cómo proporciono el certificado y la clave pública / privada junto con la solicitud de C #?
c#
asp.net-web-api
dotnet-httpclient
Abhijeet
fuente
fuente
new Uri("https://foobar.com/");
Respuestas:
Si el servidor solo admite una versión TLS más alta como TLS 1.2 solamente, seguirá fallando a menos que su PC cliente esté configurada para usar una versión TLS más alta de manera predeterminada. Para superar este problema, agregue lo siguiente en su código.
Modificando su código de ejemplo, sería
fuente
SecurityProtocolType.Tls12
No podía encontrar esos valores de enumeración que usted ha mencionadoSimplemente especifique HTTPS en el URI.
Foobar.com necesitará tener un certificado SSL de confianza o sus llamadas fallarán con un error no confiable.
EDITAR respuesta: certificados de cliente con HttpClient
EDITAR Respuesta2: Si el servidor al que se está conectando ha deshabilitado SSL, TLS 1.0 y 1.1 y todavía está ejecutando .NET Framework 4.5 (o inferior), debe elegir
fuente
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
GetMyX509Certificate
?Su código debe modificarse de esta manera:
Solo tiene que usar el
https:
esquema URI. Hay una página útil aquí en MSDN sobre las conexiones HTTP seguras. En efecto:Además, considere que las conexiones HTTPS usan un certificado SSL. Asegúrese de que su conexión segura tenga este certificado; de lo contrario, las solicitudes fallarán.
EDITAR:
¿Qué significa que no funciona? Las solicitudes fallan? ¿Se lanza una excepción? Aclara tu pregunta.
Si las solicitudes fallan, entonces el problema debería ser el certificado SSL.
Para solucionar el problema, puede usar la clase
HttpWebRequest
y luego su propiedadClientCertificate
. Además, puede encontrar aquí una muestra útil sobre cómo realizar una solicitud HTTPS utilizando el certificado.Un ejemplo es el siguiente (como se muestra en la página de MSDN vinculada anteriormente):
fuente
Cuando me conecto
https
, también recibí este error, agrego esta línea antesHttpClient httpClient = new HttpClient();
y me conecto con éxito:Lo sé por esta respuesta y otra respuesta similar y el comentario menciona:
Además, no probé el método en Otra respuesta que usa
new X509Certificate()
onew X509Certificate2()
para hacer un Certificado, no estoy seguro de que simplemente crear pornew()
funcione o no.EDITAR: Algunas referencias:
Crear un certificado de servidor autofirmado en IIS 7
Importar y exportar certificados SSL en IIS 7
Convertir .pfx a .cer
Mejores prácticas para usar ServerCertificateValidationCallback
Creo que el valor de Thumbprint es igual a
x509certificate.GetCertHashString()
:Recuperar la huella digital de un certificado
fuente
Tuve el mismo problema al conectarme a GitHub, que requiere un agente de usuario. Por lo tanto, es suficiente proporcionar esto en lugar de generar un certificado
fuente
123456789
?Hay una configuración no global a nivel de
HttpClientHandler
:Por lo tanto, uno habilita las últimas versiones de TLS.
Tenga en cuenta que el valor predeterminado
SslProtocols.Default
es en realidadSslProtocols.Ssl3 | SslProtocols.Tls
(verificado para .Net Core 2.1 y .Net Framework 4.7.1).fuente
Solo especificar HTTPS en el URI debería ser suficiente.
Si la solicitud funciona con HTTP pero falla con HTTPS, este es sin duda un problema de certificado . Asegúrese de que la persona que llama confíe en el emisor del certificado y que el certificado no haya caducado. Una forma rápida y fácil de verificar eso es intentar realizar la consulta en un navegador.
También es posible que desee verificar en el servidor (si es suyo y / o si puede) que está configurado para atender las solicitudes HTTPS correctamente.
fuente
También recibí el error:
... con una aplicación de orientación Xamarin Forms para Android que intenta solicitar recursos de un proveedor de API que requirió TLS 1.3.
La solución fue actualizar la configuración del proyecto para intercambiar el cliente http "administrado" (.NET) de Xamarin (que no es compatible con TLS 1.3 a partir de Xamarin Forms v2.5), y en su lugar usar el cliente nativo de Android.
Es un simple cambio de proyecto en Visual Studio. Ver captura de pantalla a continuación.
fuente
Agregue las siguientes declaraciones a su clase:
Después:
Y:
¿Contento? :)
fuente
Tuve este problema y en mi caso la solución fue estúpidamente simple: abrir Visual Studio con derechos de administrador. Probé todas las soluciones anteriores y no funcionó hasta que hice esto. Espero que le ahorre a alguien un tiempo precioso.
fuente
Puede intentar usar el paquete ModernHttpClient Nuget: después de descargar el paquete, puede implementarlo de esta manera:
fuente
Estoy de acuerdo con felickz pero también quiero agregar un ejemplo para aclarar el uso en c #. Yo uso SSL en el servicio de Windows de la siguiente manera.
Si voy a usarlo en una aplicación web, solo estoy cambiando la implementación en el lado del proxy de esta manera:
fuente
Por error:
Creo que debe aceptar el certificado incondicionalmente con el siguiente código
como escribió Oppositional en su respuesta a la pregunta .NET client que se conecta a la API web SSL .
fuente