Nuestro grupo de expertos despúes de ciertos días de investigación y de recopilar de información, obtuvieron la respuesta, nuestro deseo es que resulte útil para ti para tu plan.
Solución:
Si el servidor solo admite una versión de TLS superior, como TLS 1.2, seguirá fallando, a menos que su PC cliente esté configurada para usar una versión de TLS superior de forma predeterminada. Para superar este problema, agregue lo siguiente en su código.
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
Modificando su código de ejemplo, sería
HttpClient httpClient = new HttpClient();
//specify to use TLS 1.2 as default connection
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
httpClient.BaseAddress = new Uri("https://foobar.com/");
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
var task = httpClient.PostAsXmlAsync("api/SaveData", request);
Simplemente especifique HTTPS en el URI.
new Uri("https://foobar.com/");
Foobar.com deberá tener un certificado SSL confiable o sus llamadas fallarán con un error no confiable.
EDIT Respuesta: ClientCertificates con HttpClient
WebRequestHandler handler = new WebRequestHandler();
X509Certificate2 certificate = GetMyX509Certificate();
handler.ClientCertificates.Add(certificate);
HttpClient client = new HttpClient(handler);
EDITAR Respuesta 2: 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
- Actualice a .Net 4.6+ (Admite TLS 1.2 por defecto)
- Agregue cambios de registro para indicar a 4.5 que se conecte a través de TLS1.2 (Consulte: artículo de Salesforce para compatibilidad y keys para cambiar O verificar IISCrypto ver los comentarios de respuesta de Ronald Ramos)
- Agregue el código de la aplicación para configurar manualmente .NET para conectarse a través de TLS1.2 (consulte la respuesta de Ronald Ramos)
Su código debe ser modificado de esta manera:
httpClient.BaseAddress = new Uri("https://foobar.com/");
Solo tienes que usar el https:
esquema URI. Hay una página útil aquí en MSDN sobre las conexiones HTTP seguras. Por supuesto:
Utilice el esquema https: URI
El Protocolo HTTP define dos esquemas URI:
http: se utiliza para conexiones sin cifrar.
https: se utiliza para conexiones seguras que deben cifrarse. Esta opción también utiliza certificados digitales y autoridades de certificación para verificar que el servidor es quien dice ser.
Además, tenga en cuenta que las conexiones HTTPS utilizan un certificado SSL. Asegúrese de que su conexión segura tenga este certificado; de lo contrario, las solicitudes fallarán.
EDITAR:
El código anterior funciona bien para hacer llamadas http. Pero cuando cambio el esquema a https no funciona, déjame publicar el error.
¿Qué significa que no funciona? ¿Fallan las solicitudes? ¿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 utilizar la clase HttpWebRequest
y luego su propiedad ClientCertificate
. 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):
//You must change the path to point to your .cer file location.
X509Certificate Cert = X509Certificate.CreateFromCertFile("C:\mycert.cer");
// Handle any certificate errors on the certificate from the server.
ServicePointManager.CertificatePolicy = new CertPolicy();
// You must change the URL to point to your Web server.
HttpWebRequest Request = (HttpWebRequest)WebRequest.Create("https://YourServer/sample.asp");
Request.ClientCertificates.Add(Cert);
Request.UserAgent = "Client Cert Sample";
Request.Method = "GET";
HttpWebResponse Response = (HttpWebResponse)Request.GetResponse();
Agradecemos que quieras añadir valor a nuestro contenido informacional añadiendo tu veteranía en las notas.