Problem: Unsere mobile App kann keine sichere Verbindung zu unserem Webdienst mehr herstellen, da iOS 9 jetzt ATS verwendet.
Hintergrund: iOS 9 führt App Transport Security ein
Server-Setup: Windows Server 2008 R2 SP1 (VM) IIS 7.5, SSL-Zertifikate von Digicert. Windows-Firewall ausgeschaltet.
Schlüssel RSA 2048 Bit (e 65537)
Aussteller DigiCert SHA2 Secure Server CA.
Signaturalgorithmus SHA512withRSA
Dies sind die Sicherheitsanforderungen für den App-Transport:
Der Server muss mindestens das TLS-Protokoll (Transport Layer Security) Version 1.2 unterstützen. Verbindungs-Chiffren sind auf diejenigen beschränkt, die Vorwärtsgeheimnis bieten (siehe Liste der Chiffren unten). Zertifikate müssen mit einem SHA256-Hash-Algorithmus oder einem besseren Signatur-Hash-Algorithmus mit einem RSA-Schlüssel mit 2048 Bit oder mehr oder einer Elliptic-Kurve mit mindestens 256 Bit signiert werden (ECC) Schlüssel. Ungültige Zertifikate führen zu einem harten Fehler und keiner Verbindung. Dies sind die akzeptierten Chiffren:
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
Was wurde versucht:
- Hinzufügen von Ausnahmen in der mobilen App, damit unsere Domain funktioniert, aber ich möchte nicht mit dieser ungesicherten Methode arbeiten, sondern unser SSL reparieren.
- Verwendete IIS Crypto , um "Best Practice", "PCI" und benutzerdefinierte Setups zu verwenden. Es wurde sogar versucht, die Crypto-Suite auf die obige Liste zu ändern und neu zu ordnen. Nach jedem Versuch wird der Server neu gestartet und SSL Labs wurde ausgeführt (nachdem der Cache geleert wurde). Es gelang mir, von einer F-Bewertung zu einer A-Bewertung und sogar zu einer A-Bewertung zu wechseln, aber dies führte nur dazu, dass iOS 8 und 9 keine sicheren Verbindungen herstellen konnten. (NSURLErrorDomain Code = -1200 und _kCFStreamErrorCodeKey = -9806)
- VM wiederhergestellt und ein Powershell-Skript ausprobiert Richten Sie Ihren IIS für SSL Perfect Forward Secrecy und TLS 1.2 ein. Ich habe sogar einen zweiten Versuch unternommen, bei dem ich Chiffren aus dem Power-Skript herausgeschnitten habe, um eine minimale Liste der erforderlichen Elemente zu erhalten.
Ergebnisse: Immer ähnlich, Bewertungen von A oder A-. iOS8 und iOS9 können keine sichere Verbindung aushandeln. Die Handshake-Simulation führt zu einer "Nichtübereinstimmung von Protokoll oder Cipher Suite" für Safari- und iOS-Produkte.
UPDATE Nachdem wir mit dem Apple-Support zusammengearbeitet hatten, haben wir einige Paketverfolgungserfassungen durchgeführt:
$ tcpdump -n -r trace.pcap
reading from file trace.pcap, link-type EN10MB (Ethernet)
client > server [S], seq 1750839998, win 65535, length 0
server > client [S.], seq 2461151276, ack 1750839999, win 8192, length 0
client > server [.], ack 1, win 4104, length 0
client > server [P.], seq 1:175, ack 1, win 4104, length 174
server > client [R.], seq 1, ack 175, win 0, length 0
Die ersten drei Pakete sind der klassische Drei-Wege-Handshake SYN - SYN-ACK - ACK, mit dem die TCP-Verbindung hergestellt wird. Das vierte Paket ist iOS, das Ihrem Server eine TLS-Client-Hello-Nachricht sendet. Dies ist der erste Schritt beim Einrichten einer TLS-Verbindung über diese TCP-Verbindung. Ich habe diese Nachricht auseinandergezogen und sie sieht vernünftig genug aus. Im fünften Paket trennt der Server einfach die Verbindung (durch Senden eines RST).
Weiß jemand, warum IIS 7.5 eine RST durchführen würde?
Antworten:
Die Frage ist alt, wird aber bei der Suche gefunden. Ich habe einige Zeit damit verbracht, eine Lösung für das gleiche Problem zu finden. Daher entscheide ich mich, die Antwort zu schreiben, um meine Ergebnisse mit anderen zu teilen.
Kurze Antwort: Sie sollten IIS Crypto nicht verwenden, um die Reihenfolge der Cipher Suites festzulegen. Ich empfehle Ihnen, auf die Schaltflächen "Standard" zu klicken, um die zuvor festgelegte Reihenfolge zu entfernen, und dann Gruppenrichtlinien ("Computerkonfiguration" \ "Administrative Vorlagen" \ "Netzwerk" \ "SSL-Konfigurationseinstellungen") zu verwenden, um Cipher Suites über lokale Richtlinien zu konfigurieren.
Der Grund für den Fehler "Nichtübereinstimmung von Protokoll oder Verschlüsselungssuite" kann einer der folgenden sein :
Die genaue schwarze Liste kann auf verschiedenen Systemen unterschiedlich sein. Sie können im Internet einige schwarze Liste finden. Beispielsweise enthält Anhang A von RFC 7540 (Hypertext Transfer Protocol Version 2 (HTTP / 2)) eine Liste. Die Cipher Suites sind
TLS_RSA_WITH_AES_128_CBC_SHA
für TLS 1.2 (siehe hier )TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
undTLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
für TLS 1.3 (siehe hier ). DasTLS_ECDHE_ECDSA_*
ist nur wichtig, wenn Sie ein Zertifikat mit elliptischen Kurven verwenden. Andere sehr gute Cipher SuiteTLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
ist noch nicht von Microsoft implementiert. Darüber hinaus können Sie in Betracht ziehen, zumindestTLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
Verbindungen zur Unterstützung von alten Systemen undTLS_RSA_WITH_AES_128_CBC_SHA
sehr alte Systeme (Android 2.3.7, Java 6u45, OpenSSL 0.9.8y) zu unterstützen undTLS_RSA_WITH_3DES_EDE_CBC_SHA
nur dann, wenn Sie IE 8 / XP unterstützen müssen. So können Sie zum Beispiel heute verwendenmit deaktiviertem TLS 1.0, TLS 1.1, um eine bessere Sicherheit zu haben oder einfach
wenn Sie gute Sicherheit und die beste Leistung benötigen.
Sie können beispielsweise die folgende kurze Verschlüsselungssuite festlegen, um Ihr Problem zu lösen:
Im Folgenden finden Sie ein Beispiel für die Konfiguration unter Windows 10. Ich habe IIS 10 so konfiguriert, dass es von Qualys SSL Labs mit RSA 2048-Schlüssel und kostenlosem SSL-Zertifikat von Let's Encrypt mit A + bewertet wird .
Ich habe DES 56/56, RC2 128/128, RC2 40/128, RC2 56/128, RC4 128/128, RC4 40/128, RC4 56/128, RC4 64/128, Triple DES 168/168, NULL, deaktiviert. MD5, Multi-Protocol Unified Hello, PCT 1.0, SSL 2.0, SSL 3.0 und TLS 1.0 / 1.1 manuell in der Registrierung (siehe KB245030 ). Ich habe die Protokolle TLS 1.0 und TLS 1.1 nur deaktiviert, weil TLS_FALLBACK_SCSV (Downgrade-Angriff) in IIS bisher nicht verhindert werden kann, was es unmöglich macht, die Bewertung A + von www.ssllabs.com zu erhalten . Ich sehe es als Nachteil, aber TLS 1.2 wird derzeit sehr weit unterstützt. Übrigens können Sie
DisabledByDefault: 1
aberEnabled: 1
für TLS 1.0 und TLS 1.1 verwenden. Es kann hilfreich sein, wenn Sie SQL Server 2008/2012 auf dem Computer ausführen. Der Webserver verwendet nicht TLS 1.0 und TLS 1.1, SQL Server jedoch.Der wichtigste Schritt, der mir viel Zeit kostet und der Ihr Hauptproblem darstellt, war die Konfiguration der Cipher Suites. Ich habe es mit gemacht
gpedit.msc
. Ich habe "Computerkonfiguration" \ "Administrative Vorlagen" \ "Netzwerk" \ "SSL-Konfigurationseinstellungen" ausgewählt und den Wert "SSL Cipher Suite Order" wie folgt konfiguriertDie obige Reihenfolge könnte nicht optimal sein und ich bin nicht sicher, ob alle oben genannten Protokolle unter IIS 7.5 unterstützt werden (ich habe IIS 10.0 unter Windows 10 verwendet). Trotzdem bin ich mir sicher, dass Ihr Problem mit der Liste der Cipher Suite zusammenhängt, da ich genau das gleiche Problem hatte, das Sie während meiner Experimente mit der Liste der Cipher Suite beschrieben haben.
In jedem Fall erhalte ich nach dem Konfigurieren der obigen Einstellungen in Group Polity und dem Neustart des Computers (
gpupdate /force /target:computer
was in meinen Tests nicht ausreichte) A + -Bewertungen und die folgende Liste der Testergebnisse des Teils "Handshake-Simulation":Man kann sehen, dass iOS für die folgenden Clients erfolgreich unterstützt wird:
Die Clients, die TLS 1.2 nicht unterstützen, scheinen mir jetzt nicht so wichtig zu sein, und ich denke, dass die obige Konfiguration ein guter Kompromiss zwischen der Unterstützung älterer Clients und der Verwendung sicherer Protokolle ist.
quelle
Wenn Ihr IIS Crypto-Image aktuell ist, behalten Sie die Einstellungen bei, aktivieren Sie jedoch SHA, Diffie-Hellman und PKCS. Dadurch erhalten Sie die A-Bewertung, aber iOS 8 und niedriger können eine Verbindung herstellen.
quelle
Ich hatte ein paar Tage damit zu kämpfen. Insbesondere stellte ich über Xamarin Forms PCL eine Verbindung von einer iOS-App her, um eine Verbindung zu einem ASP.NET Web Api 2-Restdienst mit OAuth2 Bearer Token-Authentifizierung herzustellen.
Am Ende hat es für mich funktioniert, die Best Practices von IIS Crypto zu verwenden. Bearbeiten Sie dann den Registrierungsschlüssel, den er für die Reihenfolge der Cipher Suite festgelegt hat:
Ich hatte Erfolg mit folgendem Wert:
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P521, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P521, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P521, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P521, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256, TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_3DES_EDE_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P521,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P521, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P521, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P384, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P521, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P384, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P256, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P521, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P256, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P521, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P256, TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, TLS_DHE_DSS_WITH_AES_256_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,TLS_DHE_DSS_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA, TLS_RSA_WITH_RC4_128_SHA, 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_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_RC4_128_MD5, TLS_RSA_WITH_DES_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
Der letzte wurde mithilfe von Charles Proxy gefunden, der TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 automatisch aushandelte. Die Sache, die mich dazu führte, war, dass die Verbindungen mit Charles Proxy (mit installierten Simulatorzertifikaten) erfolgreich waren, aber ansonsten fehlschlugen. Das Hinzufügen der Suite, die bei der Verhandlung verwendet wurde, hat den Trick getan. Es scheint (?), Dass der Proxy mit meinem Restdienst mit etwas neu verhandelt hat, das von meinem Server unterstützt wurde, aber nicht vom iOS-Client.
Beachten Sie, dass viele der Cipher Suites aus der Spezifikation von ssllabs für bevorzugte Suites für verschiedene iOS / OSX-Geräte stammen. Der obige Wert sollte laut ssllabs mit allem außer IE 6 unter XP per Handshake mit einer A-Bewertung angezeigt werden.
quelle