Ich habe Probleme, meine Windows 8-Anwendung dazu zu bringen, über SSL mit meiner Test-Web-API zu kommunizieren.
Es scheint, dass HttpClient / HttpClientHandler keine Option zum Ignorieren nicht vertrauenswürdiger Zertifikate bietet, wie es WebRequest Ihnen ermöglicht (wenn auch auf "hackige" Weise mit ServerCertificateValidationCallback
).
Jede Hilfe wäre sehr dankbar!
c#
.net
windows-8
windows-runtime
Jamie
quelle
quelle
Antworten:
Unter Windows 8.1 können Sie jetzt ungültigen SSL-Zertifikaten vertrauen. Sie müssen entweder den Windows.Web.HttpClient verwenden oder, wenn Sie den System.Net.Http.HttpClient verwenden möchten, den von mir geschriebenen Message-Handler-Adapter verwenden: http://www.nuget.org/packages/WinRtHttpClientHandler
Die Dokumente befinden sich auf dem GitHub: https://github.com/onovotny/WinRtHttpClientHandler
quelle
Eine schnelle und schmutzige Lösung besteht darin, den
ServicePointManager.ServerCertificateValidationCallback
Delegaten zu verwenden. Auf diese Weise können Sie Ihre eigene Zertifikatvalidierung bereitstellen. Die Validierung wird global auf die gesamte App-Domäne angewendet.Ich verwende dies hauptsächlich für Unit-Tests in Situationen, in denen ich gegen einen Endpunkt laufen möchte, den ich gerade hoste, und versuche, ihn mit einem WCF-Client oder dem zu treffen
HttpClient
.Für Produktionscode möchten Sie möglicherweise eine feinkörnigere Steuerung und sollten die Eigenschaft
WebRequestHandler
und ihreServerCertificateValidationCallback
Delegate-Eigenschaft verwenden (siehe die Antwort von dtb unten ). Oder antworten Sie mit demHttpClientHandler
. Ich bevorzuge jetzt beide bei meinen Integrationstests gegenüber meiner bisherigen Vorgehensweise, es sei denn, ich kann keinen anderen Haken finden.quelle
ServicePointManager.GetServicePoint(Uri)
(siehe Dokumente ) verwenden, um den Servicepunkt abzurufen, der nur für Aufrufe dieser URI gilt. Sie können dann Eigenschaften festlegen und Ereignisse basierend auf dieser Teilmenge verarbeiten.Schauen Sie sich die WebRequestHandler-Klasse und ihre ServerCertificateValidationCallback-Eigenschaft an :
quelle
derived class
?HttpClientHandler
?Wenn Sie versuchen, dies in einer .NET Standard-Bibliothek zu tun, finden Sie hier eine einfache Lösung mit allen Risiken einer Rückkehr
true
in Ihren Handler. Ich überlasse die Sicherheit Ihnen.quelle
Oder Sie können für den HttpClient im
Windows.Web.Http
Namespace verwenden:quelle
System.Net.Http
,System.Web
und dasWindows.Web.Http
zusammen?Wenn Sie verwenden,
System.Net.Http.HttpClient
glaube ich, ist das richtige Musterquelle
Die meisten Antworten hier schlagen vor, das typische Muster zu verwenden:
wegen der IDisposable-Schnittstelle. Bitte nicht!
Microsoft erklärt Ihnen warum:
Und hier finden Sie eine detaillierte Analyse, was sich hinter den Kulissen abspielt: https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
In Bezug auf Ihre SSL-Frage und basierend auf https://docs.microsoft.com/en-us/azure/architecture/antipatterns/improper-instantiation/#how-to-fix-the-problem
Hier ist dein Muster:
quelle
Wenn dies für eine Windows Runtime-Anwendung gilt, müssen Sie dem Projekt das selbstsignierte Zertifikat hinzufügen und im Appxmanifest darauf verweisen.
Die Dokumente finden Sie hier: http://msdn.microsoft.com/en-us/library/windows/apps/hh465031.aspx
Dasselbe gilt, wenn es sich um eine nicht vertrauenswürdige Zertifizierungsstelle handelt (wie eine private Zertifizierungsstelle, der der Computer selbst nicht vertraut). Sie müssen das öffentliche Zertifikat der Zertifizierungsstelle abrufen, es als Inhalt zur App hinzufügen und dann dem Manifest hinzufügen.
Sobald dies erledigt ist, sieht die App es als korrekt signiertes Zertifikat.
quelle
Ich habe keine Antwort, aber ich habe eine Alternative.
Wenn Sie Fiddler2 verwenden , um den Datenverkehr zu überwachen UND die HTTPS-Entschlüsselung zu aktivieren, wird sich Ihre Entwicklungsumgebung nicht beschweren. Dies funktioniert nicht auf WinRT-Geräten wie Microsoft Surface, da Sie keine Standard-Apps auf diesen installieren können. Aber Ihr Entwicklungs-Win8-Computer wird in Ordnung sein.
Um die HTTPS-Verschlüsselung in Fiddler2 zu aktivieren, gehen Sie zu Extras > Fiddler-Optionen> HTTPS (Registerkarte)> Aktivieren Sie "HTTPS-Verkehr entschlüsseln" .
Ich werde diesen Thread im Auge behalten und hoffe, dass jemand eine elegante Lösung findet.
quelle
Ich fand ein Beispiel in diesem Kubernetes Client , wo sie wurden mit X509VerificationFlags.AllowUnknownCertificateAuthority zu vertrauen selbstsignierten selbstsignierten Stammzertifikate. Ich habe ihr Beispiel leicht überarbeitet, um mit unseren eigenen PEM-codierten Stammzertifikaten zu arbeiten. Hoffentlich hilft das jemandem.
quelle
Ich habe online ein Beispiel gefunden, das gut zu funktionieren scheint:
Zuerst erstellen Sie eine neue ICertificatePolicy
Verwenden Sie dies dann einfach, bevor Sie Ihre http-Anfrage wie folgt senden:
http://www.terminally-incoherent.com/blog/2008/05/05/send-a-https-post-request-with-c/
quelle
ServicePointManager.CertificatePolicy
ist veraltet: docs.microsoft.com/en-us/dotnet/framework/whats-new/…