LearnHouse

[轉]在使用 NSURLSession 時允許使用不安全的 SSL 連線

但很多時候你就會去做那些你不該做的事。比方說,你要寫一個 iOS 上的 Client,而 API Server 也還在開發中,接下來所有的 API 都會使用 HTTPS,但是還沒有花錢去買憑證,所以就先隨便產生了一個東西檔著先,而如果你使用 NSURLSession 試圖建立不安全的 HTTPS 連線的話,NSURLSession 就拒絕連線並且回傳 Error 物件。但是這種狀況下,你還是要先想辦法把連線建立起來,才有辦法在 Server 還在開發中的狀況下也寫點 Client Side 的程式。

首先我們必須要建立自己的 NSURLSession 物件,這樣才能夠在建立物件的時候,把 delegate 物件傳進去。NSURLSession 的 delegate 是一個唯讀的屬性,只能在建立 instance 的時候傳遞進去;所以,我們也不能改變 [NSURLSession sharedSession] 的 delegate 屬性。

NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
URLSession = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:operationQueue];

接著實作一個 delegate method

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler
{
#warning This allows insecure SSL. We need to remove this from release builds.
 NSURLProtectionSpace * protectionSpace = challenge.protectionSpace;
 if ([protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
 SecTrustRef serverTrust = protectionSpace.serverTrust;
 completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust: serverTrust]);
 }
 else {
 completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, nil);
 }
}

千萬記得在 Release 軟體的時候把這段拿掉。

資料來源:http://api.logdown.com/posts/168699/using-nsurlsession-allows-the-use-of-less-secure-ssl-online

posted by admin in 程式&軟體 and have No Comments

Place your comment

Please fill your data and comment below.
Name
Email
Website
Your comment