Come configurare IIS 7.5 SSL \ TLS per funzionare con iOS 9 ATS


11

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:

  1. 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.
  2. 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) inserisci qui la descrizione dell'immagine
  3. 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. inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

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?


Ho contattato nuovamente Digicert, abbiamo cambiato il mio certificato RSA per un certificato ECC. Ora iOS 9 funziona in modo sicuro, ma ora iOS 8 non si collegherà in diversi tentativi di configurazione.
RobDigital,

Risposte:


5

La domanda è vecchia, ma verrà trovata durante la ricerca. Ho impiegato del tempo per trovare la soluzione allo stesso problema. Decido quindi di scrivere la risposta per condividere i miei risultati con gli altri.

Risposta breve: non utilizzare IIS Crypto per specificare l'ordine di Cipher Suites. Ti consiglio di fare clic sui pulsanti "Predefiniti" per rimuovere l'ordine precedentemente impostato e quindi utilizzare Criteri di gruppo ("Configurazione computer" \ "Modelli amministrativi" \ "Rete" \ "Impostazioni di configurazione SSL") per configurare Cipher Suites tramite criteri locali.

La ragione dell'errore "mancata corrispondenza del protocollo o della suite di crittografia" può essere una delle seguenti :

  • il tuo server supporta alcune "suite di crittografia errate"
  • il tuo server non supporta alcune suite di crittografia, che DEVONO essere supportate corrispondono alla specifica TLS.
  • il tuo server supporta HTTP / 2 e ha alcuni protocolli dalla lista nera sopra gli altri protocolli, che non sono nella lista . In genere è sufficiente modificare l'ordine delle suite di crittografia per risolvere il problema.

La lista nera esatta potrebbe essere diversa su sistemi diversi. Puoi trovare in Internet una lista nera. Ad esempio, l' appendice A di RFC 7540 (Hypertext Transfer Protocol versione 2 (HTTP / 2)) contiene un elenco. Le suite di crittografia sono TLS_RSA_WITH_AES_128_CBC_SHAper TLS 1.2 (vedi qui ) TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256e TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256per TLS 1.3 (vedi qui ). L' TLS_ECDHE_ECDSA_*sono importanti solo è di utilizzare il certificato con curve ellittiche. Un'altra ottima suite di cifratura TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256non è ancora implementata da Microsoft. Inoltre, puoi considerare di aggiungere almeno TLS_ECDHE_RSA_WITH_AES_256_CBC_SHAper supportare la connessione da vecchi sistemi e TLS_RSA_WITH_AES_128_CBC_SHAper supportare sistemi molto vecchi (Android 2.3.7,, Java 6u45, OpenSSL 0.9.8y) e TLS_RSA_WITH_3DES_EDE_CBC_SHAsolo se hai bisogno di supporto per IE 8 / XP. Quindi puoi usare oggi, per esempio

TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA

con TLS 1.0 disabilitato, TLS 1.1 per avere una sicurezza migliore o semplicemente

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

se devi avere una buona sicurezza e le migliori prestazioni.

Ad esempio, è possibile impostare il seguente breve set di suite di crittografia per risolvere il problema:

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

Di seguito includo un esempio di configurazione su Windows 10. Ho configurato IIS 10 per avere un rating A + da Qualys SSL Labs con chiave RSA 2048 e certificato SSL gratuito da Let's Encrypt .

inserisci qui la descrizione dell'immagine

Ho disabilitato 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, MD5, Hello unificato multiprotocollo, PCT 1.0, SSL 2.0, SSL 3.0 e TLS 1.0 / 1.1 manualmente nel registro (vedere KB245030 ). Ho disabilitato i protocolli TLS 1.0 e TLS 1.1 solo perché TLS_FALLBACK_SCSV (attacco downgrade) non può essere impedito in IIS fino ad ora, il che rende impossibile ottenere un rating A + di www.ssllabs.com . Lo vedo come uno svantaggio, ma TLS 1.2 è attualmente supportato molto ampio. A proposito, puoi usare DisabledByDefault: 1, ma Enabled: 1per TLS 1.0 e TLS 1.1. Potrebbe essere utile eseguire SQL Server 2008/2012 sul computer. Il server Web non utilizzerà TLS 1.0 e TLS 1.1, ma SQL Server lo utilizza.

Il passo più importante, che mi dà molto tempo e che è il tuo problema principale è stata la configurazione delle Suite Cipher. L'ho fatto usando gpedit.msc. Ho scelto "Configurazione computer" \ "Modelli amministrativi" \ "Rete" \ "Impostazioni di configurazione SSL" e ho configurato il valore "Ordine crittografia SSL" al seguente

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

L'ordine sopra potrebbe non essere ottimale e non sono sicuro che tutti i protocolli sopra siano supportati su IIS 7.5 (ho usato IIS 10.0 da Windows 10). Tuttavia, sono sicuro che il tuo problema è correlato all'elenco di Cipher Suite, perché ho avuto esattamente lo stesso problema che hai descritto durante i miei esperimenti con l'elenco di Cipher Suite.

In ogni caso, dopo aver configurato le impostazioni di cui sopra in Group Polity e riavviato il computer ( gpupdate /force /target:computernon era sufficiente nei miei test) ottengo le valutazioni A + e il seguente elenco di risultati dei test della parte "Simulazione della stretta di mano":

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Si può vedere che iOS è supportato con successo per i seguenti client:

Safari 6 / iOS 6.0.1
Safari 7 / iOS 7.1
Safari 8 / iOS 8.4
Safari 9 / iOS 9

I client che non supportano TLS 1.2 per me ora non sembrano così importanti e penso che la configurazione di cui sopra sia un buon compromesso tra il supporto di client legacy e l'uso di protocolli sicuri.


+1 per guardarti con IISCrypto, l'ho visto erroneamente impostare i tasti di disabilitazione 3DES a 112 bit su Windows ... apprensivo quando si utilizza questo strumento.
Felickz,

0

Se la tua immagine IIS Crypto è recente, mantieni le impostazioni come sono ma abilita SHA, Diffie-Hellman e PKCS. In questo modo otterrai la valutazione A ma consenti a iOS 8 e versioni precedenti di connettersi.


Ho abilitato SHA, Diffie-Hellman e PKCS come mi hai raccomandato. Server riavviato e ripetuto il test dei laboratori ssl. Senza fortuna. ancora non riesco a connettermi con iOS 9 e ancora ottenendo "mancata corrispondenza del protocollo o della suite di crittografia" su SSL Labs.
RobDigital,

0

Ho lottato con questo per alcuni giorni. In particolare mi stavo connettendo da un'app iOS usando Xamarin Forms PCL per connettermi a un servizio di riposo ASP.NET Web Api 2 con autenticazione OAuth2 Bearer Token.

Ciò che ha funzionato per me alla fine è stato utilizzare le migliori pratiche di IIS Crypto. Quindi modificare la chiave di registro impostata per l'ordine della suite di crittografia:

KEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Cryptography\Configuration\SSL\00010002\Function

Ho avuto successo con il seguente valore:

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

L'ultimo è stato trovato utilizzando Charles Proxy, che ha negoziato automaticamente TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256. La cosa che mi ha portato a questo è che le connessioni hanno avuto successo con Charles Proxy su (con i certificati del simulatore installati), ma in caso contrario sono fallite. L'aggiunta della suite utilizzata nella negoziazione ha funzionato. Sembra (?) Che il proxy stava rinegoziando con il mio servizio di riposo con qualcosa che era supportato dal mio server, ma non dal client iOS.

Nota che molte delle suite di crittografia sono state ottenute dalle specifiche ssllabs delle suite preferite per vari dispositivi iOS / OSX. Il valore sopra dovrebbe essere in stretta di mano con tutto tranne IE 6 su XP secondo ssllabs, con un punteggio A.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.