usehttpsredirection run net dotnet aspnet asp app c# ssl asp.net-core ssl-certificate

c# - run - ssl aspnet core



omitir el certificado SSL no vĂ¡lido en.net core (6)

Estoy trabajando en un proyecto que necesita conectarse a un sitio https. Cada vez que me conecto, mi código arroja una excepción porque el certificado de ese sitio proviene de un sitio no confiable. ¿Hay alguna manera de evitar la verificación de certificados en .net core http?

Vi este código de la versión anterior de .NET. Supongo que solo necesito algo como esto.

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


En .NetCore, puede agregar el siguiente fragmento de código en el método de configuración de servicios, agregué una verificación para asegurarme de que solo pasamos el certificado SSL solo en el entorno de desarrollo

services.AddHttpClient("HttpClientName", client => { // code to configure headers etc.. }).ConfigurePrimaryHttpMessageHandler(() => { var handler = new HttpClientHandler(); if (hostingEnvironment.IsDevelopment()) { handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; }; } return handler; });


Me enfrenté al mismo problema al trabajar con certificados autofirmados y autenticación de certificados de cliente en .NET Core 2.2 y contenedores Docker Linux. Todo funcionó bien en mi máquina de desarrollo de Windows, pero en Docker recibí ese error:

System.Security.Authentication.AuthenticationException: el certificado remoto no es válido según el procedimiento de validación

Afortunadamente, el certificado se generó utilizando una cadena. Por supuesto, siempre puede ignorar esta solución y utilizar las soluciones anteriores.

Así que aquí está mi solución:

  1. Guardé el certificado usando Chrome en mi computadora en formato P7B .

  2. Convierta el certificado al formato PEM con este comando:
    openssl pkcs7 -inform DER -outform PEM -in <cert>.p7b -print_certs > ca_bundle.crt

  3. Abra el archivo ca_bundle.crt y elimine todas las grabaciones de Asunto, dejando un archivo limpio. Ejemplo a continuación:

-----BEGIN CERTIFICATE----- _BASE64 DATA_ -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- _BASE64 DATA_ -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- _BASE64 DATA_ -----END CERTIFICATE-----

  1. Ponga estas líneas en el Dockerfile (en los pasos finales):

# Update system and install curl and ca-certificates RUN apt-get update && apt-get install -y curl && apt-get install -y ca-certificates # Copy your bundle file to the system trusted storage COPY ./ca_bundle.crt /usr/local/share/ca-certificates/ca_bundle.crt # During docker build, after this line you will get such output: 1 added, 0 removed; done. RUN update-ca-certificates

  1. En la aplicación:

var address = new EndpointAddress("https://serviceUrl"); var binding = new BasicHttpsBinding { CloseTimeout = new TimeSpan(0, 1, 0), OpenTimeout = new TimeSpan(0, 1, 0), ReceiveTimeout = new TimeSpan(0, 1, 0), SendTimeout = new TimeSpan(0, 1, 0), MaxBufferPoolSize = 524288, MaxBufferSize = 65536, MaxReceivedMessageSize = 65536, TextEncoding = Encoding.UTF8, TransferMode = TransferMode.Buffered, UseDefaultWebProxy = true, AllowCookies = false, BypassProxyOnLocal = false, ReaderQuotas = XmlDictionaryReaderQuotas.Max, Security = { Mode = BasicHttpsSecurityMode.Transport, Transport = new HttpTransportSecurity { ClientCredentialType = HttpClientCredentialType.Certificate, ProxyCredentialType = HttpProxyCredentialType.None } } }; var client = new MyWSClient(binding, address); client.ClientCredentials.ClientCertificate.Certificate = GetClientCertificate("clientCert.pfx", "passwordForClientCert"); // Client certs must be installed client.ClientCredentials.ServiceCertificate.SslCertificateAuthentication = new X509ServiceCertificateAuthentication { CertificateValidationMode = X509CertificateValidationMode.ChainTrust, TrustedStoreLocation = StoreLocation.LocalMachine, RevocationMode = X509RevocationMode.NoCheck };

Método GetClientCertificate:

private static X509Certificate2 GetClientCertificate(string clientCertName, string password) { //Create X509Certificate2 object from .pfx file byte[] rawData = null; using (var f = new FileStream(Path.Combine(AppContext.BaseDirectory, clientCertName), FileMode.Open, FileAccess.Read)) { var size = (int)f.Length; var rawData = new byte[size]; f.Read(rawData, 0, size); f.Close(); } return new X509Certificate2(rawData, password); }


Puede anular la verificación del certificado SSL en una llamada HTTP con una función de devolución de llamada anónima como esta

using (var httpClientHandler = new HttpClientHandler()) { httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => { return true; }; using (var client = new HttpClient(httpClientHandler)) { // Make your request... } }

Además, sugiero usar un patrón de fábrica para HttpClient porque es un objeto compartido que podría no eliminarse de inmediato y, por lo tanto, las conexiones permanecerán abiertas .


Resuelvo con esto:

Startup.cs

public void ConfigureServices(IServiceCollection services) { services.AddHttpClient("HttpClientWithSSLUntrusted").ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler { ClientCertificateOptions = ClientCertificateOption.Manual, ServerCertificateCustomValidationCallback = (httpRequestMessage, cert, cetChain, policyErrors) => { return true; } });

YourService.cs

public UserService(IHttpClientFactory clientFactory, IOptions<AppSettings> appSettings) { _appSettings = appSettings.Value; _clientFactory = clientFactory; } var request = new HttpRequestMessage(... var client = _clientFactory.CreateClient("HttpClientWithSSLUntrusted"); HttpResponseMessage response = await client.SendAsync(request);


ServicePointManager.ServerCertificateValidationCallback no es compatible con .Net Core.

La situación actual es que será un nuevo método ServerCertificateCustomValidationCallback para el próximo contrato 4.1. * System.Net.Http (HttpClient). El equipo de .NET Core está finalizando el contrato 4.1 ahora. Puedes leer sobre esto aquí en github

Puede probar la versión preliminar de System.Net.Http 4.1 utilizando las fuentes directamente aquí en CoreFx o en el feed MYGET: https://dotnet.myget.org/gallery/dotnet-core

WinHttpHandler.ServerCertificateCustomValidationCallback actual de WinHttpHandler.ServerCertificateCustomValidationCallback en Github


Vine aquí buscando una respuesta al mismo problema, pero estoy usando WCF para NET Core. Si estás en el mismo bote, usa:

client.ClientCredentials.ServiceCertificate.SslCertificateAuthentication = new X509ServiceCertificateAuthentication() { CertificateValidationMode = X509CertificateValidationMode.None, RevocationMode = X509RevocationMode.NoCheck };