Saltar al contenido

Agregar certificado de cliente a .net core Httpclient

Recuerda que en la informática cualquier problema puede tener diversas soluciones, así que aquí te mostraremos lo más óptimo y eficiente.

Solución:

Ejecuté una instalación nueva para mi plataforma (Linux Mint 17.3) siguiendo estos pasos: https://www.microsoft.com/net/core. Creé una nueva aplicación de consola dirigida a la netcoreapp1.0 marco, pudo enviar un certificado de cliente; sin embargo, recibí “Error de conexión SSL” (CURLE_SSL_CONNECT_ERROR 35) durante la prueba, aunque utilicé un certificado válido. Mi error podría ser específico de mi libcurl.

actualizar: Ejecuté exactamente lo mismo en Windows 7 y funcionó exactamente como lo necesitaba.

// using System.Net.Http;
// using System.Security.Authentication;
// using System.Security.Cryptography.X509Certificates;

var handler = new HttpClientHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.SslProtocols = SslProtocols.Tls12;
handler.ClientCertificates.Add(new X509Certificate2("cert.crt"));
var client = new HttpClient(handler);
var result = client.GetAsync("https://apitest.startssl.com").GetAwaiter().GetResult();

Tengo un proyecto similar en el que me comunico entre servicios, así como entre dispositivos móviles y de escritorio con un servicio.

Usamos el certificado Authenticode del EXE para asegurarnos de que son nuestros archivos binarios los que realizan las solicitudes.

En el lado solicitante (más simplificado para la publicación).

Module m = Assembly.GetEntryAssembly().GetModules()[0];
using (var cert = m.GetSignerCertificate())
using (var cert2 = new X509Certificate2(cert))

   var _clientHandler = new HttpClientHandler();
   _clientHandler.ClientCertificates.Add(cert2);
   _clientHandler.ClientCertificateOptions = ClientCertificateOption.Manual;
   var myModel = new Dictionary
   
        "property1","value" ,
        "property2","value" ,
   ;
   using (var content = new FormUrlEncodedContent(myModel))
   using (var _client = new HttpClient(_clientHandler))
   using (HttpResponseMessage response = _client.PostAsync($"url/controler/action", content).Result)
   
       response.EnsureSuccessStatusCode();
       string jsonString = response.Content.ReadAsStringAsync().Result;
       var myClass = JsonConvert.DeserializeObject(jsonString);
    

Luego uso el siguiente código en la acción que recibe la solicitud

X509Certificate2 clientCertInRequest = Request.HttpContext.Connection.ClientCertificate;
if (!clientCertInRequest.Verify() || !AllowedCerialNumbers(clientCertInRequest.SerialNumber))

    Response.StatusCode = 404;
    return null;

Preferimos proporcionar un 404 que un 500, ya que nos gustan aquellos que intentan URL para obtener una solicitud incorrecta en lugar de hacerles saber que están “en el camino correcto”.

Básicamente, la forma de obtener el certificado ya no es revisar el Módulo, la forma moderna que podría funcionar para usted es:

private static X509Certificate2? Signer()

    using var cert = X509Certificate2.CreateFromSignedFile(Assembly.GetExecutingAssembly().Location);
    if (cert is null)
        return null;

    return new X509Certificate2(cert);

No estoy usando .Net para mi cliente, pero del lado del servidor se puede configurar simplemente a través de IIS implementando mi sitio web Asp.Net Core detrás de IIS, configurando IIS para HTTPS + certificados de cliente:

configuración de certificado de cliente iis:

Entonces puedes obtenerlo simplemente en el código:

        var clientCertificate = await HttpContext.Connection.GetClientCertificateAsync();

        if(clientCertificate!=null)
            return new ContentResult()  Content = clientCertificate.Subject ;

Funciona bien para mí, pero estoy usando curl o Chrome como clientes, no .Net. Durante el protocolo de enlace HTTPS, el cliente recibe una solicitud del servidor para proporcionar un certificado y enviarlo al servidor.

La cuestión es que, si está utilizando un cliente .Net Core, no puede tener un código específico de la plataforma y tendría sentido si no pudiera conectarse a ningún almacén de certificados específico del sistema operativo, para extraerlo y enviarlo al servidor. Si estaba compilando contra .Net 4.5.x, entonces parece fácil:

Using HttpClient with SSL/TLS-based client side authentication

Es como cuando compilas curl, si quieres poder conectarlo al almacén de certificados de Windows, tienes que compilarlo contra alguna biblioteca específica de Windows.

Más adelante puedes encontrar las críticas de otros creadores, tú incluso tienes la opción de dejar el tuyo si dominas el tema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *