2

我使用NSURLConnection的調用Web服務並沒有出現在我的鑰匙串,我在- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challengeNSURLConnection的委託方法,要求authenticationChallenge沒有被解僱?

設置爲憑據我刪除了這個證書,並添加新的一個鑰匙圈當客戶端證書,NSURLConnection的仍保持憑證我已經給出並在417狀態錯誤代碼(這是200,在我刪除舊證書之前)給我。

有沒有辦法讓NSURLConnection強制要求憑證?或者如何關閉現有的SSL連接或身份驗證質詢憑證。

回答

2

NSURLConnection是變態的野獸,過去幾天我也遇到類似的問題。但是我已經找到了解決我的問題的方法,並提出了一些建議,以解決您可能遇到的問題的原因。

TLS

首先有可能是發生了什麼,你是TLS層緩存的憑據。這是由於建立TLS連接在計算上是昂貴的[1]。

可能的解決方法是更改​​所使用的DNS名稱,例如在字符串末尾添加一個點(。),因爲DNS協議接受以點爲結尾的字符串作爲完全限定的DNS名稱。我還看到有人向所有URL請求添加hashtag(#),因此欺騙系統從不查找存儲的憑證,而只是啓動didRecieveAuthenticationChallenge調用,而不是[2]。

餅乾

另一種可能性是,服務器設置,你將需要清除的cookie。

-(void)clearCookies:(NSString *)urlString{ 
    NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedCookieStorage]; 
    NSURL *url = [[NSURL alloc] initWithString urlString]; 
    NSArray *cookies = [cookieStorage cookiesForURL:tempURL]; 

    for(NSHTTPCookie *cookie in cookies){ 
     //iterate over all cookies and delete them 
     [cookieStorage deleteCookie:cookie]; 
    } 

} 

NSURLCredentialStorage

現在可能是憑據仍然被存儲在sharedCredentialStorage,因此應通過執行以下操作進行刪除:

您可以通過執行以下操作做到這一點
NSURLCredentialStorage *store = [NSURLCredentialStorage sharedCredentialStorage]; 
if(store !=nil){ 
    for(NSURLProtectionSpace *protectionSpace in [store allCredentials]){ 
     NSDictionary *map = [[NSURLCredentialStorage sharedCredentialStorage] 
            credentialsForProtectionSpace:protectionSpace]; 
     if(map!=nil){ 
     for(NSString *user in map){ 
      NSURLCredential *cred = [map objectForKey:user]; 
      [store removeCredential:cred forProtectionSpace:protectionSpace]; 
      } 
     } 
    } 
} 

我希望這些會有所幫助。

相關問題