2012-02-16 3 views
5

Я пытаюсь выполнить проверку сертификата SSL и реализовал делегат canAuthenticateAgainstProtectionSpaceметода IOS canAuthenticateAgainstProtectionSpace не вызывается каждый раз, когда

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

Однако я заметил, что этот делегат вызывается в первый раз для данного URL, но не для последующих попыток для одного и того же URL. Я думал, что это было связано с кешированной ответ, поэтому я создал NSURLRequest вроде следующего:

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

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

Это не помогает. Любые идеи, как я могу получить метод canAuthenticateAgainstProtectionSpace для вызова каждый раз?

ответ

2

Я решил эту проблему, добавив следующий код:

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

выше отменяет запрос аутентификации и поэтому делегат canAuthenticateAgainstProtectionSpace вызывается каждый раз, когда

10

Ответ выше не решает актуальную проблему , Реальная проблема здесь заключается в том, что вызов аутентификации представляется только при первом установлении соединения для этого URL-адреса, пока приложение открыто.

Как пояснил here

ДУС сеанса загружает процессор и Apple, не хочет, чтобы вы создать новый каждый раз, когда соединение производится к этому URL, поэтому они кэшировать для вас. В этом случае он работает против вас, но вы должны иметь возможность обойти проблему, включив «.». символа в конце вашего хоста.

В нашем случае мы пытались установить соединение с веб-сервером, содержащим сертификат, выпущенный внутренним ЦС. Поскольку мы знали, что CA не будет доверено первому соединению, мы разрешили продолжить соединение, чтобы CA мог быть загружен. Во время этой связи мы добавляем «.». символ до конца хоста. Все последующие соединения используют обычный URL без "." символ в конце хоста. Это гарантирует, что сертификат CA, который мы скачали, проверяется при первом «реальном» соединении.

+0

Безумный, такой полезный намек! Большое вам спасибо за это! :-) – Lepidopteron

Смежные вопросы