2012-02-16 11 views
5

che sto cercando di eseguire la convalida del certificato SSL e hanno attuato il canAuthenticateAgainstProtectionSpace delegatometodo iOS canAuthenticateAgainstProtectionSpace non chiamato ogni volta

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace: (NSURLProtectionSpace*)protectionSpace 
{ 
    OSStatus status = SecTrustEvaluate(protectionSpace.serverTrust, &trustResult); 
    if(status == errSecSuccess) 
    { 
    } 
    else 
    { 
    } 
} 

Tuttavia, ho notato che questo delegato viene chiamato la prima volta per un determinato URL, ma non per tentativi successivi per lo stesso URL. Ho pensato che questo avesse a che fare con la risposta in cache, così ho creato il NSURLRequest come la seguente:

NSURLRequest *request = [[NSURLRequest alloc] 
         initWithURL: [NSURL URLWithString:_urlString] 
         cachePolicy: NSURLRequestReloadIgnoringLocalAndRemoteCacheData 
         timeoutInterval: 10 
         ]; 

NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

Questo non aiuta. Qualche idea, come posso ottenere il metodo Autenticato ControProtectionSpace per essere chiamato ogni volta?

risposta

2

ho risolto il problema aggiungendo il seguente codice:

- (void)connection:(NSURLConnection *)connection 
didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
[[challenge sender] cancelAuthenticationChallenge:challenge]; 
} 

Il sopra descritto, la richiesta di autenticazione e così il canAuthenticateAgainstProtectionSpace delegato viene chiamato ogni volta

10

La risposta di cui sopra non risolve il problema reale . Il vero problema qui è che una sfida di autenticazione viene presentata solo la prima volta che viene stabilita una connessione per quell'URL mentre l'app è aperta.

Come spiegato here

sessione Un TLS è intensivo del processore e Apple non vuole che la creazione di uno nuovo ogni volta che viene effettuata una connessione a tale URL, in modo da memorizzare nella cache una per te. In questo caso, sta funzionando contro di te, ma dovresti essere in grado di aggirare il problema includendo un "." personaggio alla fine del tuo host.

Nel nostro caso, stavamo cercando di stabilire una connessione a un server Web contenente un certificato emesso da una CA interna. Poiché sapevamo che la CA non sarebbe stata considerata attendibile alla prima connessione, abbiamo consentito alla connessione di continuare in modo che la CA potesse essere scaricata. Durante quella connessione, aggiungiamo il "." carattere alla fine dell'host. Tutte le connessioni successive utilizzano l'URL normale senza "." personaggio alla fine dell'host. Ciò garantisce che il certificato CA scaricato sia stato convalidato la prima volta che viene stabilita una connessione "reale".

+0

Insano, un suggerimento così utile! Grazie mille per aver condiviso questo! :-) – Lepidopteron

Problemi correlati