Ich arbeite an einem Projekt, das eine Verbindung zu einer https-Site herstellen muss. Jedes Mal, wenn ich eine Verbindung herstelle, 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 Zertifikatsprüfung in .net core http zu umgehen?
Ich habe diesen Code aus einer früheren Version von .NET gesehen. Ich brauche wohl so etwas.
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
c#
ssl
asp.net-core
ssl-certificate
Ramppy Dumppy
quelle
quelle
Antworten:
ServicePointManager.ServerCertificateValidationCallback wird in .Net Core nicht unterstützt.
Derzeit handelt es sich um eine neue ServerCertificateCustomValidationCallback- Methode für den kommenden 4.1. * System.Net.Http-Vertrag (HttpClient). Das .NET Core-Team schließt jetzt den 4.1-Vertrag ab. Sie können darüber 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-core
Aktuelle WinHttpHandler.ServerCertificateCustomValidationCallback- Definition auf Github
quelle
Aktualisieren:
Wie unten erwähnt, unterstützen nicht alle Implementierungen diesen Rückruf (dh Plattformen wie iOS). In diesem Fall können Sie, wie in den Dokumenten angegeben , den Validator explizit festlegen:
Dies funktioniert auch für .NET Core 2.2, 3.0 und 3.1
Alte Antwort , mit mehr Kontrolle, kann aber werfen
PlatformNotSupportedException
:Sie können die SSL-Zertifikatsprüfung bei einem HTTP-Aufruf mit einer solchen anonymen Rückruffunktion überschreiben
Außerdem empfehle ich, ein Factory-Muster zu verwenden,
HttpClient
da es sich um ein freigegebenes Objekt handelt, das möglicherweise nicht sofort entsorgt werden kann und daher die Verbindungen offen bleiben .quelle
HttpClient
Eigenschaft namens aufgerufenDangerousAcceptAnyServerCertificateValidator
, mit der dies unter MacOSX funktioniert. Weitere Infos hier - github.com/dotnet/corefx/pull/19908factory pattern
fürHttpClient
?GetHttpClient
Methode die konfigurierte zurückgibt,HttpClient
und verwenden Sie sie innerhalb einesusing
Blocks.Ich löse damit:
Startup.cs
YourService.cs
quelle
Kam hier auf der Suche nach einer Antwort auf das gleiche Problem, aber ich verwende WCF für NET Core. Wenn Sie im selben Boot sitzen, verwenden Sie:
quelle
In .NetCore können Sie das folgende Code-Snippet bei der Services Configure-Methode hinzufügen. Ich habe eine Überprüfung hinzugefügt, um sicherzustellen, dass nur das SSL-Zertifikat nur in der Entwicklungsumgebung übergeben wird
quelle
Ich hatte das gleiche Problem, als ich mit selbstsignierten Zertifikaten und Client-Zertifikatsauthentifizierung auf .NET Core 2.2- und Docker Linux-Containern arbeitete. Auf meinem Windows-Entwickler hat alles gut funktioniert, aber in Docker habe ich folgende Fehlermeldung erhalten:
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:
Ich habe das Zertifikat mit Chrome auf meinem Computer im P7B- Format gespeichert.
Konvertieren Sie das Zertifikat mit diesem Befehl in das PEM-Format:
openssl pkcs7 -inform DER -outform PEM -in <cert>.p7b -print_certs > ca_bundle.crt
Öffnen Sie die Datei ca_bundle.crt, löschen Sie alle Betreff-Aufzeichnungen und hinterlassen Sie eine saubere Datei. Beispiel unten:
GetClientCertificate-Methode:
quelle
Erstens, verwenden Sie es nicht in der Produktion
Wenn Sie die AddHttpClient-Middleware verwenden, ist dies hilfreich. Ich denke, es wird für Entwicklungszwecke benötigt, nicht für die Produktion. Bis Sie ein gültiges Zertifikat erstellen, können Sie diese Funktion verwenden.
und wende es gerne an
quelle
Das Zulassen aller Zertifikate ist sehr leistungsfähig, kann aber auch gefährlich sein. Wenn Sie nur gültige Zertifikate und einige bestimmte Zertifikate zulassen möchten, können Sie dies folgendermaßen tun.
Originalquelle:
https://stackoverflow.com/a/44140506/3850405
quelle