- 調(diào)試信息
測(cè)試環(huán)境是SSL3.0/TLS1.0,證書(shū)是通過(guò)Verisign頒發(fā)的
錯(cuò)誤信息是:9846, An ssl error has occurred and a secure connection to the server cannot be made
實(shí)現(xiàn)了“NSURLSession:didReceiveChallenge:completionHandler”, 并使用“completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, nil)”
- 回答無(wú)效,收到三次challenge后Request失敗
可以使用獨(dú)立的代碼重現(xiàn)這個(gè)問(wèn)題,所以可以確定與APP本身邏輯無(wú)關(guān)
在iPad上裝了服務(wù)器證書(shū),但是問(wèn)題依然存在
ATS已經(jīng)關(guān)閉
換回NSURLConnection驗(yàn)證可以通過(guò): 在“connection:canAuthenticateAgainstProtectionSpace:”方法中返回NO,可以直接忽略Server Trust Challenge
- 解決方法:
為什么收到多次的challenge,最終還是失?。盒枰B接的服務(wù)器并不支持TLS1.2,而iOS默認(rèn)支持的版本是TLS1.2,這樣,iOS在失敗后會(huì)嘗試著繼續(xù)與服務(wù)器連接,這里的不同點(diǎn)是,NSURLConnection會(huì)嘗試低版本的TLS,但是NSURLSession卻會(huì)繼續(xù)嘗試TLS1.2,這就導(dǎo)致了連接失敗
最簡(jiǎn)單也是推薦的解決方法是升級(jí)服務(wù)器,支持TLS1.2
如果還是希望支持TLS1.0:
將:NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil];
修改成:
NSURLSessionConfiguration * config = [NSURLSessionConfiguration defaultSessionConfiguration];
config.TLSMaximumSupportedProtocol = kTLSProtocol1;
NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
這里將最高版本設(shè)置成1.0,也就是意味著NSURLSession將只會(huì)嘗試連接TLS1.0。
其實(shí)這里有個(gè)問(wèn)題,我們嘗試過(guò)將“TLSMinimumSupportedProtocol” 設(shè)置成TLS1.0,但是事實(shí)上iOS并不會(huì)去嘗試連接低版本的TLS