Die App Transport Security von iOS9 besagt, dass Verbindungen, die bestimmte Anforderungen nicht erfüllen, fehlschlagen. Nachfolgend sind die Anforderungen aus Apples Dokument aufgeführt (https://developer.apple.com/library/prerelease/ios/technotes/App-Transport-Security-Technote/index.html)
- Der Server muss mindestens das Transport Layer Security (TLS)-Protokoll Version 1.2 unterstützen.
- Verbindungschiffren sind auf solche beschränkt, die Vorwärtsgeheimnis bieten (siehe die Liste der Schiffern unten).
- Zertifikate müssen mit einem Signatur-Hash-Algorithmus der Stärke SHA256 oder höher und entweder mit einem RSA-Schlüssel der Stärke 2048 Bit oder höher oder einem Elliptic-Curve-Schlüssel (ECC) der Stärke 256 Bit oder höher signiert werden.
Ich habe überprüft, dass mein Server tatsächlich ein Zertifikat mit einem 2048-Bit-RSA-Schlüssel verwendet und mit dem SHA256-Hash-Algorithmus signiert ist. Meine mit Xcode7 erstellte App konnte sich jedoch mit der Standard-ATS-Einstellung nicht mit meinem Server verbinden. Nachdem ich in der App jedoch NSExceptionRequiresForwardSecrecy
auf eingestellt hatte , war die Verbindung erfolgreich. Es sieht also so aus, als ob mein Server nicht richtig mit Forward-Secrecy-Chiffren konfiguriert ist. Unten ist meine aktuelle Einstellung in nginx.conf:NO
Info.plist
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
Mein Zertifikat wird von Comodo ausgestellt und die Einstellung, die ich oben verwendet habe, stammt auch aus dem Support-Dokument von Comodo (https://support.comodo.com/index.php?/Default/Knowledgebase/Article/View/789/37/certificate-installation-nginx).
Laut dem Dokument von Apple werden mit den ATS-Standardeinstellungen folgende Chiffren akzeptiert:
- TLS_ECDHE_ECDSA_MIT_AES_256_GCM_SHA384
- TLS_ECDHE_ECDSA_MIT_AES_128_GCM_SHA256
- TLS_ECDHE_ECDSA_MIT_AES_256_CBC_SHA384
- TLS_ECDHE_ECDSA_MIT_AES_256_CBC_SHA
- TLS_ECDHE_ECDSA_MIT_AES_128_CBC_SHA256
- TLS_ECDHE_ECDSA_MIT_AES_128_CBC_SHA
- TLS_ECDHE_RSA_MIT_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_MIT_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_MIT_AES_256_CBC_SHA384
- TLS_ECDHE_RSA_MIT_AES_128_CBC_SHA256
- TLS_ECDHE_RSA_MIT_AES_128_CBC_SHA
(Es scheint, dass die SSL_Ciphers-Einstellung meines Nginx diese Chiffren hat.)
Und wenn in den App-Einstellungen NSExceptionRequiresForwardSecrecy
dies eingestellt ist NO
, werden auch folgende Chiffren akzeptiert:
- LS_RSA_WITH_AES_256_GCM_SHA384
- TLS_RSA_MIT_AES_128_GCM_SHA256
- TLS_RSA_MIT_AES_256_CBC_SHA256
- TLS_RSA_MIT_AES_256_CBC_SHA
- TLS_RSA_MIT_AES_128_CBC_SHA256
- TLS_RSA_MIT_AES_128_CBC_SHA
Wenn dies auf eingestellt ist NO
, stellt meine App erfolgreich eine Verbindung zu meinem Server her, der Grund dafür ist mir jedoch unbekannt.
Meine Frage lautet also: Wie muss ich Nginx für Vorwärtsgeheimnis-Chiffren einrichten, damit die iOS9-App (Xcode7) mit den ATS-Standardeinstellungen erfolgreich eine Verbindung herstellen kann?
AKTUALISIERT:
Ich habe meinen Server neu konfiguriert, indem ich der Anleitung vonhttps://weakdh.org/sysadmin.html. Ich erstelle eine neue DH-Gruppe mit dem folgenden Befehl:
openssl dhparam -out dhparams.pem 2048
und habe es in meine Nginx-Konfiguration eingefügt:
ssl_dhparam dhparams.pem;
Die Verbindung von meiner App schlägt jedoch weiterhin fehl. Das nsurl --ats-diagnostics
Tool zeigt weiterhin an, dass das Problem durch Forward Secrecy verursacht wird.
Für Diagnosezwecke ist unten dieSSL-TestScreenshot der Ergebnisseite meines Servers bereitgestellt vonAbonnieren: