web-dev-qa-db-de.com

kCFStreamErrorDomainSSL, -9802 beim Herstellen einer Verbindung zu einem Server über eine IP-Adresse über HTTPS in iOS 9

Wir haben eine iOS-App, die über HTTPS eine Verbindung zu unserem Server herstellt. Wenn die App mit dem neuen iOS 9 SDK erstellt und unter iOS 9 ausgeführt wird, tritt der folgende Fehler auf:

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)

Die App verwendet AFNetworking 1.3.4 mit angehefteten Zertifikaten. Das Problem tritt auf, wenn ich mit seiner IP-Adresse eine Verbindung zum Server herstelle. Es funktioniert, wenn ich die Konfiguration NSAllowsArbitraryLoads hinzufüge oder wenn ich eine Verbindung zum Server mit dem Domänennamen herstelle.

Der Tomcat-Connector ist mit sslEnabledProtocols = "TLSv1, TLSv1.1, TLSv1.2" konfiguriert.

Ich habe versucht den Hostnamen zu überschreiben , aber es scheint nichts zu ändern.

Ich kann noch nicht viel offizielle Dokumentation zu ATS finden. Vielleicht sollte die Verbindung mit der IP-Adresse nicht funktionieren?

23
Ryan Fung

iOS9 erfordert, dass der Server nur TLSv1.2 unterstützt und die perfekte Vorwärtssicherheit unterstützt.

Außerdem muss die App IPV6 unterstützen, einschließlich der Tatsache, dass keine fest codierten IP-Adressen verwendet werden. Empfohlen wird die Verwendung von NSURLSession. Andernfalls müssen Ausnahmezusätze in der App-Liste vorgenommen werden.

Siehe die WWDC-15-Sitzung "Sicherheit und Ihre Apps".

Siehe auch Steven Petersons Blog für Details.

29
zaph

Sie können dies in Ihre "Info.plist" - Datei einfügen, damit nicht gesicherte Verbindungen hergestellt werden können:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
5
comonitos

Ich fand eine weitere Antwort auf einen Stapelüberlauf mit einer Checkliste der genauen neuen Anforderungen auf dem Server, um die Standardanforderungen für die App-Transport-Sicherheit in iOS 9 vollständig zu erfüllen: Checkliste für die Anforderungen an den iOS 9-Sicherheitsserver

Ich hoffe, das hilft.

3
Litome

Ich blieb eine Weile hängen und habe alle Tricks in Info.plist ausprobiert, hatte aber immer noch den Fehler:

HTTP load failed (kCFStreamErrorDomainSSL, -9813)

beim Versuch, eine Verbindung zu einem Localhost-Server in der Entwicklung herzustellen.

Lokale Entwicklung mit einem reaktiven nativen Projekt, das eine Verbindung zu einer API herstellt, die mit einem selbstsignierten Zertifikat ausgestattet ist. Ich hatte mein System so eingestellt, dass es dem Zertifikat vertraut, aber es dauerte eine Weile, bis mir klar wurde, dass ich auch den IOS Simulator benötigte mein Zertifikat als vertrauenswürdig zu akzeptieren, um diesen Fehler zu überwinden.

Auf dem Startbildschirm Ihres Simulators sollten Sie in der Lage sein, die Zertifikatsdatei in den Simulator zu ziehen, um ihn zum Hinzufügen des Zertifikatsprofils aufzufordern. Wenn das Zertifikat über eine Localhost-URL im Safari-Browser des Simulators zugänglich ist, können Sie es möglicherweise über Safari akzeptieren.

Hoffe, das hilft jemandem, als ich im Kreis herumging, bevor es für mich geklickt hat!

2
DamienB

Lösung 1:

Wenn Sie nach work around Suchen, gehen Sie wie folgt vor:

  1. Fügen Sie NSAllowsArbitraryLoads Schlüssel des Typs Boolean mit dem Wert true .

Ihre Info.plist-Datei sollte folgendermaßen aussehen:

Screenshot 1

Dieser Ansatz wird jedoch nicht empfohlen, da er alle unsicheren Verbindungen zulässt.

Lösung 2:

Der SSL certificate that you apply on Server should be of type TLSv2.0 minimum since iOS 10 requires this. Check this link für Details.

  1. Fügen Sie NSIncludesSubdomains Schlüssel des Typs Boolean mit dem Wert true
  2. Fügen Sie NSTemporaryExceptionAllowsInsecureHTTPLoads Schlüssel des Typs Boolean mit Wert true
  3. Fügen Sie NSTemporaryExceptionMinimumTLSVersion Schlüssel des Typs String mit dem Wert TLSv1.2

Ihre Info.plist-Datei sollte folgendermaßen aussehen:

Screenshot 2

1