Problema: la nostra app mobile non è più in grado di stabilire una connessione sicura al nostro servizio Web poiché iOS 9 ora utilizza ATS.
Sfondo: iOS 9 introduce App Transport Security
Installazione del server: Windows Server 2008 R2 SP1 (VM) IIS 7.5, certificati SSL da digicert. Firewall di Windows disattivato.
Chiave RSA 2048 bit (e 65537)
Emittente DigiCert SHA2 Secure Server CA
Algoritmo di firma SHA512 con RSA
Questi sono i requisiti di sicurezza del trasporto app:
Il server deve supportare almeno il protocollo TLS (Transport Layer Security) versione 1.2. Le cifrature di connessione sono limitate a quelle che forniscono segretezza diretta (vedere l'elenco di cifrature di seguito). I certificati devono essere firmati utilizzando un algoritmo di hash SHA256 o migliore della firma, con una chiave RSA di 2048 bit o superiore o una curva ellittica di 256 bit o superiore Tasto (ECC). I certificati non validi provocano un errore grave e nessuna connessione. Queste sono le cifre accettate:
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
Cosa è stato provato:
- Aggiungendo eccezioni nell'app per dispositivi mobili per consentire il funzionamento del nostro dominio, ma non voglio seguire questo metodo non sicuro, voglio correggere il nostro SSL.
- Ho usato IIS Crypto per usare 'best practice', provato 'pci' e configurazioni personalizzate. Ho anche provato a modificare la suite di crittografia solo nell'elenco precedente e riordinare. Dopo ogni tentativo, il server viene riavviato ed è stato eseguito SSL Labs (dopo aver svuotato la cache). Sono riuscito a passare da una valutazione F a una A e persino A-, ma questo ha comportato solo iOS 8 e 9 che non sono stati in grado di stabilire connessioni sicure. (Codice NSURLErrorDomain = -1200 e _kCFStreamErrorCodeKey = -9806)
- VM ripristinato e provato uno script PowerShell Configura IIS per SSL Perfect Forward Secrecy e TLS 1.2 Ho anche fatto un secondo tentativo in cui ho modificato i cypher dallo script Power in un elenco minimo di ciò che è richiesto.
Risultati: sempre simili, valutazioni di A o A-. iOS8 e iOS9 non possono negoziare una connessione sicura. La simulazione della stretta di mano produce "Mancata corrispondenza del protocollo o della suite di crittografia" per i prodotti Safari e iOS.
AGGIORNAMENTO Dopo aver lavorato con il supporto Apple, abbiamo eseguito l'acquisizione della traccia dei pacchetti:
$ 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
I primi tre pacchetti sono la classica stretta di mano a tre vie SYN - SYN-ACK - ACK che imposta la connessione TCP. Il quarto pacchetto è iOS che invia al tuo server un messaggio TLS Client Hello, il primo passo per impostare una connessione TLS su quella connessione TCP. Ho smontato questo messaggio e sembra abbastanza ragionevole. Nel quinto pacchetto il server elimina semplicemente la connessione (inviando un RST).
Qualcuno sa perché IIS 7.5 dovrebbe fare un RST?