Ich habe verwendet, HttpClient
um WebApi-Aufrufe mit C # zu tätigen. Scheint ordentlich und schnell im Vergleich zu WebClient
. Ich stecke jedoch fest, während ich Https
telefoniere.
Wie kann ich den folgenden Code verwenden, um Https
Anrufe zu tätigen?
HttpClient httpClient = new HttpClient();
httpClient.BaseAddress = new Uri("https://foobar.com/");
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/xml"));
var task = httpClient.PostAsXmlAsync<DeviceRequest>(
"api/SaveData", request);
BEARBEITEN 1: Der obige Code funktioniert gut für http-Aufrufe. Aber wenn ich das Schema in https ändere, funktioniert es nicht. Hier ist der Fehler erhalten:
Die zugrunde liegende Verbindung wurde geschlossen: Es konnte keine Vertrauensbeziehung für den sicheren SSL / TLS-Kanal hergestellt werden.
BEARBEITEN 2: Das Ändern des Schemas in https ist: Schritt eins.
Wie stelle ich ein Zertifikat und einen öffentlichen / privaten Schlüssel zusammen mit einer C # -Anforderung bereit?
c#
asp.net-web-api
dotnet-httpclient
Abhijeet
quelle
quelle
new Uri("https://foobar.com/");
Antworten:
Wenn der Server nur eine höhere TLS-Version wie nur TLS 1.2 unterstützt, schlägt dies weiterhin fehl, es sei denn, Ihr Client-PC ist standardmäßig für die Verwendung einer höheren TLS-Version konfiguriert. Um dieses Problem zu beheben, fügen Sie Folgendes in Ihren Code ein.
Wenn Sie Ihren Beispielcode ändern, ist dies der Fall
quelle
SecurityProtocolType.Tls12
konnte die von Ihnen erwähnten Aufzählungswerte nicht findenGeben Sie einfach HTTPS in der URI an.
Foobar.com muss über ein vertrauenswürdiges SSL-Zertifikat verfügen, sonst schlagen Ihre Anrufe mit einem nicht vertrauenswürdigen Fehler fehl.
EDIT Antwort: ClientCertificates mit HttpClient
BEARBEITEN Antwort 2: Wenn der Server, zu dem Sie eine Verbindung herstellen, SSL, TLS 1.0 und 1.1 deaktiviert hat und Sie noch .NET Framework 4.5 (oder niedriger) ausführen, müssen Sie eine Auswahl treffen
quelle
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
GetMyX509Certificate
?Ihr Code sollte folgendermaßen geändert werden:
Sie müssen nur das
https:
URI-Schema verwenden. Es gibt eine nützliche Seite hier auf MSDN über die sicheren HTTP - Verbindungen. Tatsächlich:Beachten Sie außerdem, dass die HTTPS-Verbindungen ein SSL-Zertifikat verwenden. Stellen Sie sicher, dass Ihre sichere Verbindung über dieses Zertifikat verfügt, da sonst die Anforderungen fehlschlagen.
BEARBEITEN:
Was bedeutet, dass es nicht funktioniert? Die Anfragen schlagen fehl? Eine Ausnahme wird ausgelöst? Klären Sie Ihre Frage.
Wenn die Anforderungen fehlschlagen, sollte das Problem das SSL-Zertifikat sein.
Um das Problem zu beheben, können Sie die Klasse
HttpWebRequest
und dann ihre Eigenschaft verwendenClientCertificate
. Darüber hinaus finden Sie hier ein nützliches Beispiel zum Erstellen einer HTTPS-Anforderung mithilfe des Zertifikats.Ein Beispiel ist das folgende (wie auf der zuvor verlinkten MSDN-Seite gezeigt):
quelle
Beim Verbinden mit habe
https
ich auch diesen Fehler erhalten, füge ich diese Zeile vorher hinzuHttpClient httpClient = new HttpClient();
und verbinde erfolgreich:Ich kenne es aus dieser Antwort und einem anderen ähnlichen Anwser und der Kommentar erwähnt:
Außerdem habe ich die Methode in einer anderen Antwort , die ein Zertifikat verwendet
new X509Certificate()
oder erstelltnew X509Certificate2()
, nicht ausprobiert. Ich bin mir nicht sicher, ob es einfachnew()
funktioniert oder nicht.EDIT: Einige Referenzen:
Erstellen Sie ein selbstsigniertes Serverzertifikat in IIS 7
Importieren und Exportieren von SSL-Zertifikaten in IIS 7
Konvertieren Sie .pfx in .cer
Best Practices für die Verwendung von ServerCertificateValidationCallback
Ich finde, der Wert von Thumbprint ist gleich
x509certificate.GetCertHashString()
:Rufen Sie den Fingerabdruck eines Zertifikats ab
quelle
Ich hatte das gleiche Problem beim Herstellen einer Verbindung zu GitHub, für das ein Benutzeragent erforderlich ist. Daher ist es ausreichend, dies bereitzustellen, anstatt ein Zertifikat zu generieren
quelle
123456789
?Es gibt eine nicht globale Einstellung auf der Ebene von
HttpClientHandler
:Somit werden die neuesten TLS-Versionen aktiviert.
Beachten Sie, dass der Standardwert
SslProtocols.Default
tatsächlich istSslProtocols.Ssl3 | SslProtocols.Tls
( aktiviert für .Net Core 2.1 und .Net Framework 4.7.1).quelle
Nur die Angabe von HTTPS in der URI sollte den Trick tun.
Wenn die Anforderung mit HTTP funktioniert, aber mit HTTPS fehlschlägt, handelt es sich mit Sicherheit um ein Zertifikatproblem . Stellen Sie sicher, dass der Anrufer dem Zertifikatsaussteller vertraut und das Zertifikat nicht abgelaufen ist. Eine schnelle und einfache Möglichkeit, dies zu überprüfen, besteht darin, die Abfrage in einem Browser durchzuführen.
Möglicherweise möchten Sie auch auf dem Server überprüfen (ob er Ihnen gehört und / oder ob Sie dies können), ob er so eingestellt ist, dass HTTPS-Anforderungen ordnungsgemäß verarbeitet werden.
quelle
Ich bekam auch den Fehler:
... mit einer Xamarin Forms Android- Targeting-Anwendung, die versucht, Ressourcen von einem API-Anbieter anzufordern, für den TLS 1.3 erforderlich ist .
Die Lösung bestand darin, die Projektkonfiguration zu aktualisieren, um den von Xamarin "verwalteten" (.NET) http-Client (der TLS 1.3 ab Xamarin Forms v2.5 nicht unterstützt) auszutauschen und stattdessen den nativen Android-Client zu verwenden.
Es ist ein einfacher Projektwechsel im Visual Studio. Siehe Screenshot unten.
quelle
Fügen Sie Ihrer Klasse die folgenden Deklarationen hinzu:
Nach dem:
Und:
Glücklich? :) :)
quelle
Ich hatte dieses Problem und in meinem Fall war die Lösung dumm einfach: Öffnen Sie Visual Studio mit Administratorrechten. Ich habe alle oben genannten Lösungen ausprobiert und es hat nicht funktioniert, bis ich dies getan habe. Hoffe, es spart jemandem wertvolle Zeit.
quelle
Sie können versuchen, das ModernHttpClient Nuget-Paket zu verwenden: Nachdem Sie das Paket heruntergeladen haben, können Sie es folgendermaßen implementieren:
quelle
Ich stimme felickz zu, möchte aber auch ein Beispiel zur Verdeutlichung der Verwendung in c # hinzufügen. Ich verwende SSL im Windows-Dienst wie folgt.
Wenn ich es in einer Webanwendung verwenden möchte, ändere ich die Implementierung auf der Proxyseite wie folgt:
quelle
Bei Fehler:
Ich denke, dass Sie das Zertifikat mit folgendem Code unbedingt akzeptieren müssen
wie Oppositional in seiner Antwort auf die Frage schrieb .NET-Client, der eine Verbindung zur SSL-Web-API herstellt .
quelle