it-swarm.com.de

CFNetwork SSLHandshake schlug iOS 9 fehl

hat jemand mit der iOS 9 Beta 1 dieses Problem? 

Ich verwende Standard-NSURLConnection, um eine Verbindung zu einem Webservice herzustellen. Sobald ein Aufruf an den Webservice erfolgt, erhalte ich die folgende Fehlermeldung. Dies funktioniert derzeit in iOS 8.3

Möglicher Betafehler? Ideen oder Gedanken wären toll! Ich kenne die Entwicklung von iOS 9 sehr früh

Hier ist der volle Fehler:

CFNetwork SSLHandshake fehlgeschlagen (-9824) NSURLSession/NSURLConnection-HTTP-Laden fehlgeschlagen (kCFStreamErrorDomainSSL, -9824)

 NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://mywebserviceurl"]];
        NSURLResponse * response = nil;
        NSError * error = nil;
        NSData * data = [NSURLConnection sendSynchronousRequest:urlRequest
                                                  returningResponse:&response
                                                              error:&error];
203
user3099837

für iOS 9 und OSX 10.11 ist TLSv1.2-SSL für alle Hosts erforderlich, von denen Sie Daten anfordern möchten, sofern Sie keine Ausnahmedomänen in der Info.plist-Datei Ihrer App angeben.

Die Syntax für die Info.plist-Konfiguration sieht folgendermaßen aus:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>yourserver.com</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow insecure HTTP requests-->
      <key>NSExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

Wenn Ihre Anwendung (z. B. ein Webbrowser eines Drittanbieters) eine Verbindung zu beliebigen Hosts herstellen muss, können Sie diese wie folgt konfigurieren:

<key>NSAppTransportSecurity</key>
<dict>
    <!--Connect to anything (this is probably BAD)-->
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

Wenn Sie dies tun müssen, sollten Sie Ihre Server wahrscheinlich so aktualisieren, dass sie TLSv1.2 und SSL verwenden, sofern dies nicht bereits der Fall ist. Dies sollte als temporäre Problemumgehung betrachtet werden.

In der Prerelease-Dokumentation ist bis heute keine der Konfigurationsoptionen erwähnt. Sobald dies der Fall ist, werde ich die Antwort aktualisieren, um auf die entsprechende Dokumentation zu verweisen.

308
Steven Peterson

In iOS 10+ MUSS der TLS-String die Form "TLSv1.0" haben. Es kann nicht einfach "1.0" sein. (Seufzer)


Die folgende Kombination der anderen Antworten funktioniert.

Angenommen, Sie versuchen, eine Verbindung zu einem Host (YOUR_Host.COM) herzustellen, der nur TLS 1.0 enthält.

Fügen Sie diese der Info.plist Ihrer App hinzu

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>YOUR_Host.COM</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
            <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>
64
Womble

Weitere Informationen Konfigurieren von App-Transport-Sicherheitsausnahmen in iOS 9 und OSX 10.11

Interessanterweise werden Sie feststellen, dass die Verbindung versucht, die .__ zu ändern. http-Protokoll zu https, um sich vor Fehlern in Ihrem Code zu schützen, wobei Sie haben die URL möglicherweise versehentlich falsch konfiguriert. In einigen Fällen ist dies kann tatsächlich funktionieren, aber es ist auch verwirrend.

Dieses Versenden einer App mit App Transport Security enthält einige gute Tipps zum Debuggen

ATS-Fehler

Die meisten ATS-Fehler werden als CFErrors mit einem Code in -9800 .__ angezeigt. Serie. Diese sind im Header Security/SecureTransport.h definiert

2015-08-23 06:34:42.700 SelfSignedServerATSTest[3792:683731] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)

CFNETWORK_DIAGNOSTICS

Setzen Sie die Umgebungsvariable CFNETWORK_DIAGNOSTICS auf 1, um Weitere Informationen über den Fehler erhalten Sie in der Konsole

nscurl

Das Tool durchläuft mehrere verschiedene Kombinationen von ATS Ausnahmen versuchen, eine sichere Verbindung zum angegebenen Host unter jedem ATS-Konfiguration und Berichterstattung des Ergebnisses.

nscurl --ats-diagnostics https://example.com
33
onmyway133

Nach zwei Tagen Versuchen und Misserfolgen funktionierte für mich dieser Code von womble

mit einer Änderung gemäß dieser Option post sollten wir keine Unterschlüssel mehr verwenden, die dem NSExceptionDomains - Wörterbuch dieser Art von Konventionen zugeordnet sind

  NSTemporaryExceptionMinimumTLSVersion

Und bei der neuen Convention verwenden

  NSExceptionMinimumTLSVersion

stattdessen.

Apple Dokumentation

mein code

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>YOUR_Host.COM</key>
            <dict>
                <key>NSExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSExceptionMinimumTLSVersion</key>
                <string>TLSv1.0</string>
                <key>NSExceptionRequiresForwardSecrecy</key>
                <false/>
                <key>NSIncludesSubdomains</key>
                <true/>
            </dict>
        </dict>
    </dict>
2
yehoni amran

Wenn Ihr Backend eine sichere Verbindung verwendet, erhalten Sie NSURLSession

CFNetwork SSLHandshake failed (-9801)
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9801)

sie müssen Ihre Serverkonfiguration überprüfen, um ATS-Version und SSL-Zertifikat zu erhalten.

Statt nur Zulassen unsicherer Verbindung durch Setzen von NSExceptionAllowsInsecureHTTPLoads = YES, müssen Sie stattdessen Erlaubte niedrigere Sicherheit zulassen, falls Ihr Server die Mindestanforderung (v1.2) für ATS nicht erfüllt (oder besser, um die Serverseite zu beheben). . 

Reduzierte Sicherheit für einen einzelnen Server zulassen

<key>NSExceptionDomains</key>
<dict>
    <key>api.yourDomaine.com</key>
    <dict>
        <key>NSExceptionMinimumTLSVersion</key>
        <string>TLSv1.0</string>
        <key>NSExceptionRequiresForwardSecrecy</key>
        <false/>
    </dict>
</dict>

verwenden Sie den openssl-Client, um das Zertifikat zu untersuchen und die Serverkonfiguration mithilfe des openssl-Clients abzurufen:

openssl s_client  -connect api.yourDomaine.com:port //(you may need to specify port or  to try with https://... or www.)

..finde am Ende

SSL-Session:
    Protocol  : TLSv1
    Cipher    : AES256-SHA
    Session-ID: //
    Session-ID-ctx: 
    Master-Key: //
    Key-Arg   : None
    Start Time: 1449693038
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)

App Transport Security (ATS) erfordert die Version 1.2 des Transport Layer Security (TLS) -Protokolls.

Voraussetzungen für die Verbindung mit ATS:

Die Voraussetzungen für eine Webdienstverbindung zur Verwendung von App Transport Security (ATS) umfassen den Server, die Verbindungsschlüssel und die Zertifikate wie folgt:

Zertifikate müssen mit einem der folgenden Schlüsseltypen signiert sein:

  • Secure Hash Algorithm 2 (SHA-2) -Schlüssel mit einer Digestlänge von mindestens 256 (dh SHA-256 oder höher)
  • Elliptic-Curve Cryptography (ECC) -Schlüssel mit einer Größe von mindestens 256 Bit

  • Rivest-Shamir-Adleman (RSA) -Schlüssel mit einer Länge von mindestens 2048 Bits An Ungültiges Zertifikat führt zu einem harten Fehler und keine Verbindung.

Die folgenden Verbindungsverschlüsselungen unterstützen Vorwärtsgeheimnis (FS) und funktionieren mit ATS:

TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

Update: es stellt sich heraus, dass openssl nur die minimale Protokollversion bereitstellt. Protokoll: TLSv1 links 

2
Idali

Ein weiteres nützliches Tool ist nmap (Brüh-Install nmap)

nmap --script ssl-enum-ciphers -p 443 google.com

Gibt Ausgabe aus 

Starting Nmap 7.12 ( https://nmap.org ) at 2016-08-11 17:25 IDT
Nmap scan report for google.com (172.217.23.46)
Host is up (0.061s latency).
Other addresses for google.com (not scanned): 2a00:1450:4009:80a::200e
PORT    STATE SERVICE
443/tcp open  https
| ssl-enum-ciphers: 
|   TLSv1.0: 
|     ciphers: 
|       TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|     compressors: 
|       NULL
|     cipher preference: server
|   TLSv1.1: 
|     ciphers: 
|       TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|     compressors: 
|       NULL
|     cipher preference: server
|   TLSv1.2: 
|     ciphers: 
|       TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (secp256r1) - A
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_AES_128_GCM_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_GCM_SHA384 (rsa 2048) - A
|     compressors: 
|       NULL
|     cipher preference: client
|_  least strength: C

Nmap done: 1 IP address (1 Host up) scanned in 5.48 seconds
1
Ryan Heitner

Die Syntax für die Info.plist-Konfiguration

   <key>NSAppTransportSecurity</key>
   <dict>
   <key>NSExceptionDomains</key>
    <dict>
    <key>yourserver.com</key>
   <dict>
  <!--Include to allow subdomains-->
  <key>NSIncludesSubdomains</key>
  <true/>
  <!--Include to allow insecure HTTP requests-->
  <key>NSExceptionAllowsInsecureHTTPLoads</key>
  <true/>
  <!--Include to specify minimum TLS version-->
  <key>NSExceptionMinimumTLSVersion</key>
  <string>TLSv1.1</string>
   </dict>
 </dict>

0
ALOK KUMAR

Das Gerät, das ich getestet habe, hatte eine falsche Zeit eingestellt. Wenn ich also versuchte, auf eine Seite zuzugreifen, auf die ein Zertifikat bald ausgehen würde, würde dies den Zugriff verweigern, da das Gerät zwar abgelaufen ist. Stellen Sie zur Korrektur die richtige Uhrzeit auf dem Gerät ein!

0
Warpzit

Aktualisierte Antwort (nach WWDC 2016):

iOS-Apps erfordern sichere HTTPS-Verbindungen bis zum Ende von 2016. Wenn Sie versuchen, ATS auszuschalten, wird Ihre App in Zukunft abgelehnt.

App Transport Security oder ATS ist eine Funktion, die Apple in iOS 9 eingeführt hat. Wenn ATS aktiviert ist, erzwingt es eine App, eine Verbindung zu Webdiensten über eine HTTPS-Verbindung herzustellen, anstatt nicht sicheres HTTP.

Entwickler können ATS jedoch weiterhin ausschalten und zulassen, dass ihre Apps Daten über eine HTTP-Verbindung senden, wie in den obigen Antworten erwähnt. Ende 2016 wird Apple ATS obligatorisch für alle Entwickler machen, die ihre Apps im App Store einreichen möchten. Verknüpfung

Fügen Sie in Ihrem Projekt .plist-Datei diese Berechtigung hinzu:

<key>NSAppTransportSecurity</key>
<dict>
    <!--Connect to anything (this is probably BAD)-->
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
0
Hiren Dhamecha

Dieser Fehler wurde manchmal in den Protokollen angezeigt, wenn ich eine fehlerhafte/abgestürzte Cordova iOS-Version verwendete. Es ging weg, als ich Cordova iOS aufgerüstet oder heruntergestuft hatte.

Der Server, zu dem ich eine Verbindung aufbaute, verwendete TLSv1.2 SSL. Daher wusste ich, dass dies nicht das Problem war.

0
im3r3k