2012-02-16 49 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方法每次被調用?

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

以上取消認證的挑戰,所以委託canAuthenticateAgainstProtectionSpace被調用每

回答

2

我通過添加以下代碼解決了這個問題。這裏的實際問題是,只有在應用程序處於打開狀態時第一次爲該URL建立連接時纔會顯示身份驗證問題。

至於解釋here

TLS會話是處理器密集型和蘋果不希望你創建一個新的每一個連接到該網址進行的時間,因此他們緩存一個給你。在這種情況下,它對您有用,但您應該能夠通過包含「。」來解決該問題。字符在主機的末尾。

在我們的案例中,我們試圖建立一個到包含由內部CA頒發的證書的Web服務器的連接。由於我們知道CA在第一次連接時不會被信任,因此我們允許連接繼續,以便可以下載CA.在此連接過程中,我們添加「。」字符到主機的末尾。所有後續連接均使用不帶「。」的常規URL。字符在主機的末尾。這可確保我們下載的CA證書在首次進行「真實」連接時得到驗證。

10

答案上面並沒有解決實際問題的時間:

+0

瘋了,這麼有用的提示!非常感謝你分享這個! :-) – Lepidopteron 2014-02-11 15:23:19