2015-06-11 16 views
24

Abbiamo un'app iOS che si collega al nostro server tramite HTTPS. Quando l'applicazione è costruita con il nuovo iOS SDK 9 e corse sotto iOS 9, verifica il seguente errore:kCFStreamErrorDomainSSL, -9802 durante la connessione a un server tramite l'indirizzo IP tramite HTTPS in iOS 9

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802) 

L'applicazione utilizza AFNetworking 1.3.4 con certs appuntato. Il problema si verifica se mi collego al server con il suo indirizzo IP. Funziona se aggiungo la configurazione NSAllowsArbitraryLoads o se mi collego al server con il suo nome di dominio.

Il connettore Tomcat è configurato con sslEnabledProtocols = "TLSv1, TLSv1.1, TLSv1.2".

Ho provato overriding the host name ma non sembra cambiare nulla.

Non riesco ancora a trovare molta documentazione ufficiale su ATS. Forse la connessione con l'indirizzo IP non dovrebbe funzionare?

+0

possibile duplicato [NSURLSession/NSURLConnection HTTP carico fallita] (http: // stackoverflow.com/questions/30739473/nsurlsession-nsurlconnection-http-load-failed) – Tariq

risposta

28

iOS9 richiede che il server supporti solo TLSv1.2 e supporti la perfetta sicurezza di inoltro.

Inoltre, è necessario che l'app supporti IPv6, compresi quelli che non utilizzano indirizzi IP codificati. Suggerito è quello di utilizzare NSURLSession. In caso contrario è necessario aggiungere delle eccezioni nell'app plist.

Vedere la sessione WWDC-15 "Sicurezza e app".

Vedere anche Steven Peterson's Blog per dettagli.

+0

Ottimo riferimento blog +1! – satheeshwaran

+1

Definitivamente leggere quel post del blog. Verso la fine spiega come disabilitare questo e perché probabilmente non si dovrebbe. –

+0

Che ne dici di test interni quando si desidera connettere l'app a un server sulla rete interna tramite IP (che non ha SSL)? – Brabbeldas

3

ho trovato un'altra risposta overflow dello stack con una lista di controllo dei nuovi requisiti esatti sul server per completo riempimento dei requisiti iOS 9 predefinita App Transport Security: iOS 9 Security Server requirements Checklist

Speranza che aiuta.

6

È possibile aggiungere questo nel vostro "Info.plist" file, esso consentirà connessioni non protette:

<key>NSAppTransportSecurity</key> 
<dict> 
    <key>NSAllowsArbitraryLoads</key> 
    <true/> 
</dict> 
1

mi sono bloccato su questo per un po 'ed ho provato tutti i trucchi in Info. plist ma aveva ancora l'errore:

HTTP load failed (kCFStreamErrorDomainSSL, -9813) 

quando si cerca di connettersi a un server localhost in fase di sviluppo.

Sviluppo in locale con un progetto nativo reattivo che si collega ad un'API servita con un certificato autofirmato Ho avuto il mio sistema impostato per fidarmi del certificato ma mi ci è voluto un po 'per capire che avevo anche bisogno del simulatore IOS per accettare il mio cert come fidato di superare questo errore.

Nella schermata iniziale del simulatore si dovrebbe essere in grado di trascinare il file cert nel simulatore per richiedere di aggiungere il profilo del certificato. Oppure, se il certificato è accessibile tramite un URL localhost nel browser safari del simulatore, potresti essere in grado di accettarlo tramite safari.

Spero che questo aiuti qualcuno mentre giravo in tondo prima di fare clic su di me!

0

Soluzione 1:

Se siete alla ricerca di work around quindi utilizzare sotto approccio:

  1. Aggiungi NSAllowsArbitraryLoads chiave di tipo booleano con valore vera.

Il file Info.plist dovrebbe essere simile a questo:

Screenshot 1

Tuttavia, questo approccio non è consigliata dato che consente a tutti connessione non protetta.

Soluzione 2:

Il SSL certificate that you apply on Server should be of type TLSv2.0 minimum since iOS 10 requires this. Scegli questa link per i dettagli.

  1. Aggiungi NSIncludesSubdomains chiave di tipo booleano con valore vero
  2. Aggiungi NSTemporaryExceptionAllowsInsecureHTTPLoads chiave di tipo booleano con valore vero
  3. Aggiungere NSTemporaryExceptionMinimumTLSVersion chiave di tipo String con valore TLSv1.2

Il file Info.plist dovrebbe essere simile a questo:

Screenshot 2