2015-11-29 58 views
1

我一直在試圖實現一種方法來使用NSURLSession在我的iOS 8+應用中進行公鑰固定。AuthenticationMethodServerTrust在iOS中爲零9

我只是實現委託方法didReceiveChallenge並獲取challenge.protectionSpace.authenticationMethod並檢查它是否等於NSURLAuthenticationMethodServerTrust。

如果它等於NSURLAuthenticationMethodServerTrust我檢查證書並將其與本地副本進行比較。

這適用於iOS 8但適用於iOS 9我沒有收到與NSURLAuthenticationMethodServerTrust相同的驗證方法。我收到NSURLAuthenticationMethodClientCertificate,因此我無法訪問challenge.protectionSpace.serverTrust屬性。

任何想法?

public func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential!) -> Void) 
{ 


     if(challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) 
     { 
      // Verify the identity of the server 
        println("Trusted") 
        return challenge.sender.performDefaultHandlingForAuthenticationChallenge!(challenge) 

     } 
     println("Not trusted") 
     return challenge.sender.cancelAuthenticationChallenge(challenge) 
    } 
} 
+0

檢查http://stackoverflow.com/questions/33542003/client-certificate-authentication-in-swift2/34014653#34014653鏈接。這可能會有所幫助。 – Karlos

+0

嗨卡洛斯,這對我來說不行。 :-(我有同樣的問題,維克多。 –

回答

2

對於不同的保護空間,可以多次調用回調函數。這裏發生的事情是這些調用的順序已經改變,並且服務器信任保護空間調用顯然不是由於某些原因在iOS 9中首先發生。

問題是您要取消第一個挑戰,它會有效終止連接。不要這樣做。相反,使用「執行默認處理」。

你也大概不要想執行服務器信任案例的默認處理,因爲這相當於根本不寫自定義處理程序。相反,請檢查密鑰,並僅在需要的密鑰時執行默認處理,否則請取消驗證質詢。

或者我誤解了你的代碼。它看起來像缺少一些代碼。這可能是因爲你根本沒有處理非服務器信任的情況,在這種情況下就是這個問題。如果您沒有撥打來應對每項挑戰,連接將永遠坐在那裏,等待您這樣做。

+1

謝謝@dgatwood。你救了我的一天:)顯然是iOS 9的ClientCertificateChallenge首先被調用,所以我只是補充說:... else if(challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodClientCertificate ) completionHandler(NSURLSessionAuthChallengeDisposition.PerformDefaultHandling,nil); } –

+0

僅供參考,我所說的實際上是微妙的錯誤。服務器信任的默認處理很好。它告訴它在不檢查它的情況下使用證書是不好的。 :-) – dgatwood