Xamarin Forms https mit Client-Zertifikaten löst WebException aus

8

Ich versuche, Client-Zertifikate für die Authentifizierung in einer Xamarin Forms App für iOS zu verwenden, aber nichts scheint zu funktionieren. Wenn ich die Anfrage starte, wartet die App auf das Standard-Zeitlimit von 100 Sekunden (Ich habe versucht, es mit HttpWebRequest.Timeout zu verringern, aber es scheint ignoriert zu werden), danach bekomme ich die folgende Ausnahme: Fehler beim Abrufen des Antwort-Streams (ReadDone1): ReceiveFailure

Derselbe Code wie eine Windows-Konsolenanwendung funktioniert einwandfrei. Hier einige (zur besseren Lesbarkeit vereinfachte) Schnipsel zum Reproduzieren:

Kunde:

%Vor%

Server: user.aspx

%Vor%

Dies ist die Ausnahme, die ich immer bekomme:

%Vor%
  • Visual Studio 2017 v15.3.5
  • Xamarin 4.7.9.45
  • Xamarin iOS und Xamarin Mac SDK 11.0.0.0
  • Einsatzziel iOS 9.3 (10.3 funktioniert nicht so gut)
  • Windows Server 2008 R2 Enterprise SP1
  • IIS 7

Ich habe in AppDelegate.cs eine Überprüfung für das Serverzertifikat (welches von unserer Domain-CA signiert ist) hinzugefügt, es meldet SslPolicyErrors.None

%Vor%

Die Anfrage funktioniert, wenn ich die Zertifikatsanforderung auf dem Webserver deaktiviere, damit die Verbindung funktioniert.

Ich habe sogar System.Net.HttpClient ausprobiert, aber beim Zugriff auf die Eigenschaft ClientCertificate wird eine NotImplementedException ausgelöst: (

Jetzt bin ich völlig ahnungslos, was ich als nächstes versuchen soll ... alle anderen Fragen, die ich fand, waren ein paar Jahre alt und bieten keine funktionierenden Lösungen an

    
Brandtware 04.10.2017, 09:54
quelle

4 Antworten

0

Ich habe einen Premium-Support-Anruf für dieses Problem eröffnet. Ich bin nicht berechtigt, Code zu posten, aber die Lösung bestand darin, die nativen iOS-Klassen anstelle von HttpClient oder HttpWebRequest zu verwenden.

Erstellen Sie also im Wesentlichen eine NSUrlSession, weisen Sie eine benutzerdefinierte Implementierung von INSUrlSessionDelegate zur Behandlung des DidReceiveChallenge-Ereignisses zu (um das Clientzertifikat bereitzustellen), und rufen Sie dann die CreateDataTaskAsync-Methode der NSUrlSession auf.

    
Brandtware 20.03.2018, 15:51
quelle
2

In Ihrem Ausnahmebehandler sieht es so aus, als würden Sie Response.End () nicht aufrufen:

%Vor%

Wenn also eine Ausnahme auf der Serverseite ausgelöst wird, ist es möglich, dass die Antwort niemals an den Client gesendet wird. Ich würde empfehlen, eine serverseitige Protokollierung der Ausnahme hinzuzufügen und zu überprüfen, ob auf diese Weise etwas sinnvoll ist.

Es sieht auch so aus, als ob Sie bestimmte Felder des Client-Zertifikats verifizieren, aber soweit ich Ihnen sagen kann, verifizieren Sie nicht, dass das Client-Zertifikat von einem vertrauenswürdigen root signiert wurde. Sie sollten sicherstellen, dass dies der Fall ist, oder jeder kann ein selbstsigniertes Zertifikat erstellen, das den Benutzernamen enthält, den er imitieren soll, und diesen Code verwenden, um Ihren Code zu manipulieren, was eine ernsthafte Sicherheitslücke darstellen würde.

    
jsha 14.10.2017 05:56
quelle
1

Ich habe mehrere Fragen gefunden, die auf Probleme mit dem Mono-HTTP-Stack hinweisen. Es kann helfen, Ihr Problem zu lösen: So validieren Sie SSL-Zertifikate wann Verwenden von HttpWebRequest Dringende Hilfe erforderlich: " Fehler beim Abrufen des Antwortdatenstroms (ReadDone1): ReceiveFailure ". Eine der möglichen Methoden besteht darin, ModernHttpClient zu verwenden, die plattformeigenen HTTP-Client verwenden.

Sie haben auch einen Fehler beim Rückruf in ServicePointManager.ServerCertificateValidationCallback-Eigenschaft .   RemoteCertificateValidationCallback-Delegat gibt einen booleschen Wert zurück legt fest, ob das angegebene Zertifikat zur Authentifizierung akzeptiert wird. Weitere Informationen finden Sie in MSDN-Beispielen. Versuchen Sie auch, die Frage Wie SSL-Zertifikate zu validieren, wann mit HttpWebRequest .

    
Didgeridoo 15.10.2017 20:11
quelle
1

Was passiert, wenn Sie sich über HTTPS mit dem Server verbinden, ohne das Zertifikat hinzuzufügen?

Geht die Anfrage an den Server? Wenn dies der Fall ist, besteht das Problem wahrscheinlich in der Decodierung der verschlüsselten Antwort. Sind die Zertifikate auf dem Client und dem Server identisch?

    
Leo Muller 16.10.2017 10:52
quelle