6

Penso che abbiamo appena scoperto un bug su iOS 9 (versione del 23 ottobre 2015) quando si utilizzano certificati SSL client per comunicare con un'API back-end. In comune con molti servizi REST, la nostra API genera codici di errore 4xx per comunicare lo stato. Uno di questi è un errore Proibito 403 quando un client tenta di accedere a percorsi a cui un ID cliente specifico non è autorizzato ad accedere. Si noti che questo errore HTTP si verifica DOPO che il certificato SSL client ha impostato una connessione valida & e l'ID client è stato autenticato.Bug in iOS 9 durante l'utilizzo di certificati SSL client e generazione di errori HTTP 403

In iOS 9, questa sequenza genererà un errore non valido client SSL:

FAILED: Error Domain=NSURLErrorDomain Code=-1206 "The server “our.server.here” requires a client certificate."

(nota: questo un follow-up al mio Tweet qui: https://twitter.com/ckmaresca/status/657576686318256128 - ho pensato che così è il luogo maggior parte delle persone la ricerca per questo)

risposta

10

Ci sono voluti giorni per capire, ma si scopre che questo particolare errore è generato dalla nuova sicurezza Application Transport Layer di Apple. In particolare, sembra che se si utilizzano certificati client e l'API backend generi un errore HTTP 403, ATL ritiene che il certificato sia errato e interrompa l'intera transazione.

Lo sappiamo perché possiamo vedere nei nostri registri del server che la richiesta passa e viene eseguita correttamente. Abbiamo anche osservato che il socket rimane attivo attraverso la richiesta e questo errore si manifesta solo dopo che è stata ricevuta la risposta dal server. Sappiamo anche che il nostro client cert funziona poiché ogni percorso che non restituisce un 403 funziona con zero errori e la modifica del codice di errore HTTP a 401 rende questo problema scomparso.

Questo è problematico per una serie di motivi, ma principalmente perché gli errori HTTP non sono errori SSL. I due possono funzionare in modo indipendente ed è perfettamente possibile avere un errore 403 con un certificato SSL valido lato client ....

Il lavoro attorno è quello di modificare tutti gli errori 403 in qualcos'altro. Vorrei notare che un gran numero di server Oauth1/2 genererà vari errori 403, quindi questo potrebbe essere non banale. In alternativa, potrebbe essere possibile utilizzare un proxy inverso per rimappare gli errori HTTP 403 su un altro codice HTTP: non l'abbiamo verificato.

abbiamo depositato un bug con Apple, ma ho voluto dare alla gente un testa a testa in modo forse si può evitare di sbattere la testa contro un muro come abbiamo fatto per una settimana ....

Grazie alla Sherbit.io team di ingegneri (in particolare Varun & Matt) per il debug di questo.

+0

Hey @ckm, sto avendo lo stesso identico problema e ci ho dedicato giorni. Quale soluzione hai utilizzato? Non riesco a controllare il server per non restituire 403. :(Hai trovato qualche soluzione? –

+0

Puoi anche incollare il collegamento rdar per favore? –

+0

@ckm, Stiamo ancora avendo lo stesso problema, Qualsiasi aggiornamento sul radar? – Chandra