it-swarm.com.de

umgehen Sie ein ungültiges SSL-Zertifikat im .net-Core

Ich arbeite an einem Projekt, das eine Verbindung zu einer https-Site herstellen muss. Bei jedem Verbindungsaufbau löst mein Code eine Ausnahme aus, da das Zertifikat dieser Site von einer nicht vertrauenswürdigen Site stammt. Gibt es eine Möglichkeit, die Zertifikatüberprüfung in .net core http zu umgehen?

Ich habe diesen Code aus der vorherigen Version von .NET gesehen. Ich brauche einfach so etwas.

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

ServicePointManager.ServerCertificateValidationCallback wird in .NET Core nicht unterstützt.

Die aktuelle Situation ist, dass es sich um eine Eine neue ServerCertificateCustomValidationCallback -Methode für den kommenden 4.1. * System.Net.Http-Vertrag (HttpClient) handelt. Das .NET Core-Team schließt jetzt den 4.1-Vertrag ab. Sie können darüber in hier auf github lesen.

Sie können die Vorabversion von System.Net.Http 4.1 ausprobieren, indem Sie die Quellen direkt hier in CoreFx oder im MYGET-Feed verwenden: https://dotnet.myget.org/gallery/dotnet- Ader

Aktuelle WinHttpHandler.ServerCertificateCustomValidationCallback -Definition in Github

18
Set

Sie können die SSL-Zertifizierungsprüfung für einen HTTP-Aufruf mit einer anonymen Rückruffunktion wie dieser überschreiben

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

Außerdem empfehle ich die Verwendung eines Factory-Musters für HttpClient, da es sich um ein gemeinsam genutztes Objekt handelt, das möglicherweise nicht sofort gelöscht wird und daher Verbindungen offen bleiben

50
kdaveid

Kam hier auf der Suche nach einer Antwort auf das gleiche Problem, aber ich benutze WCF für NET Core. Wenn Sie sich in demselben Boot befinden, verwenden Sie:

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

Ich löse damit:

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);
4
O.Machado

Das gleiche Problem trat auf, wenn ich mit selbstsignierten Zertifikaten und Client-Zertifizierungsauthentifizierung für .NET Core 2.2- und Docker Linux-Container arbeitete. Auf meinem Entwickler-Windows-Computer hat alles einwandfrei funktioniert, aber in Docker wurde folgender Fehler angezeigt:

System.Security.Authentication.AuthenticationException: Das Remote-Zertifikat ist gemäß dem Überprüfungsverfahren ungültig

Glücklicherweise wurde das Zertifikat mithilfe einer Kette generiert. Natürlich können Sie diese Lösung jederzeit ignorieren und die oben genannten Lösungen verwenden.

Also hier ist meine Lösung:

  1. Ich habe das Zertifikat mit Chrome auf meinem Computer im Format P7B gespeichert.

  2. Konvertieren Sie das Zertifikat in das PEM-Format mit dem folgenden Befehl:
    openssl pkcs7 -inform DER -outform PEM -in <cert>.p7b -print_certs > ca_bundle.crt

  3. Öffnen Sie die Datei "ca_bundle.crt" und löschen Sie alle Betreff-Aufzeichnungen. Eine saubere Datei bleibt erhalten. Beispiel unten:

    -----BEGIN CERTIFICATE-----
    _BASE64 DATA_
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    _BASE64 DATA_
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    _BASE64 DATA_
    -----END CERTIFICATE-----
  1. Fügen Sie diese Zeilen in das Dockerfile ein (in den letzten Schritten):
    # 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. In der App:
    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
    };

GetClientCertificate-Methode:

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);
}
2
DerSkythe