大家好,小弟最近在IOS端遇到一個(gè)問題一直沒能解決,因?yàn)槲也懦鰜頉]多久,所以困擾了很久,希望能得到大家的幫助。
問題是這樣的,根據(jù)客戶的需要,APP端在跟后臺(tái)通信的時(shí)候需要做證書的效驗(yàn)以保證通信的安全。我們的證書是從CA機(jī)構(gòu)買的,因?yàn)槲沂怯玫氖茿FNetworking框架,然后我就根據(jù)一些資料和文檔寫。
1.我先是把后臺(tái)給我的證書(.cer格式的)拖到了我的工程目錄里面。server.cer是正確的證書,為了驗(yàn)證,我自建了一個(gè)假的證書:thesis_client.cer

2.一開始我使用的是AFHTTPRequestOperationManager,然后根據(jù)查閱的一些資料上完成了代碼,給AFHTTPRequestOperationManager設(shè)置了AFSecurityPolicy屬性,代碼如下:

這個(gè)時(shí)候我遇到了第一個(gè)問題:
問題1:我查看了一下AFNetworking的源碼,發(fā)現(xiàn),當(dāng)開始一個(gè)正常的驗(yàn)證流程的時(shí)候是會(huì)執(zhí)行AFN的一個(gè)方法:evaluateServerTrust

但是打斷點(diǎn)走下來發(fā)現(xiàn)程序沒有執(zhí)行到這個(gè)方法,所以如果一開始我導(dǎo)入到工程里面的是自建的假的thesis_client.cer證書也可以訪問到我的后臺(tái),也能拿到數(shù)據(jù),但是調(diào)試下來發(fā)現(xiàn),如果我程序開著過個(gè)一段時(shí)間(大約15到20分鐘左右)再次發(fā)送網(wǎng)絡(luò)請(qǐng)求的時(shí)候,這時(shí)候AFN的走了驗(yàn)證方法evaluateServerTrust,這是我遇到的第一個(gè)問題。
3.因?yàn)檫@樣肯定不是想要的結(jié)果,所以我就重新嘗試其他的方法,就不用AFHTTPRequestOperationManager,換成了AFHTTPSessionManager,也對(duì)他進(jìn)行了同樣的AFSecurityPolicy設(shè)置,代碼跟設(shè)置AFHTTPRequestOperationManager是一樣的,這次發(fā)現(xiàn),當(dāng)我第一次與我們的后臺(tái)建立鏈接的時(shí)候就走到了AFN的驗(yàn)證方法evaluateServerTrust。而且也能有正確的結(jié)果,就是正確的證書server.cer通過了驗(yàn)證而 thesis_client. cer沒有通過驗(yàn)證。
但是這個(gè)時(shí)候我又遇到了兩個(gè)問題:
a.我發(fā)現(xiàn)只有在第一次與后臺(tái)建立鏈接的時(shí)候才會(huì)進(jìn)行驗(yàn)證,后面的請(qǐng)求就都不進(jìn)行驗(yàn)證了
b.在測(cè)試的發(fā)現(xiàn),上面的代碼在IOS7和IOS9上是可行的(先不管是否只有第一次的進(jìn)行驗(yàn)證),至少每次第一次請(qǐng)求的時(shí)候都會(huì)進(jìn)行驗(yàn)證,但是在IOS8下,卻沒有走AFN的驗(yàn)證方法evaluateServerTrust,所以在IOS8下使用假證書thesis_client.cer也可以訪問到后臺(tái)。
4.后來我想AFHTTPSessionManager也是使用的NSURLSession,我干脆直接用NSURLSession寫個(gè)demo試試看,我看了一下NSURLSession的文檔,看見了他的didReceiveChallenge方法


因?yàn)槲沂莻€(gè)新手很多東西都不是很理解,就覺得大致的意思就是,當(dāng)收到驗(yàn)證要求的時(shí)候就會(huì)走NSURLSession的這個(gè)代理,下面描述的第二項(xiàng),說當(dāng)?shù)谝淮闻c遠(yuǎn)程服務(wù)器建立鏈接的認(rèn)證證書,不知道這個(gè)是不是就是我上面遇到的問題,IOS9和IOS7下只有第一次走認(rèn)證方法,之后的請(qǐng)求都沒有走的原因,還希望大家點(diǎn)播我一下。
然后我就開始寫demo了


測(cè)試了一下發(fā)現(xiàn),果然和上面遇到的情況一下,IOS9和IOS7下走了NSURLSession的代理didReceiveChallenge,在IOS8下沒有走。然后我就更加疑惑了,不知道那里出問題了。
后來我發(fā)現(xiàn)了兩個(gè)情況出現(xiàn)了:
a.上面我自己寫的NSURLSession請(qǐng)求的地@"https://gis.map2bit.com/mobile/getMyProject"就是我們自己后臺(tái)的地址,后來我把這個(gè)地址改掉了,改成github的官網(wǎng)地址

發(fā)現(xiàn)在IOS8下走到了didReceiveChallenge的代理里面了,后來我又嘗試https://baidu.com和Adobe的官網(wǎng),發(fā)現(xiàn)都是可以正常走到didReceiveChallenge這個(gè)代理,唯獨(dú)我們自己的后臺(tái)不行,這個(gè)時(shí)候我就在想是不是后臺(tái)的原因。。。。
b. 后來我打算先看看我們的后臺(tái)地址是不是跟github、百度他們的有什么不一樣的地方,我就用Charles試了試,在試的過程并沒有發(fā)現(xiàn)有什么不一樣的地方,但是發(fā)現(xiàn)一個(gè)問題,我用Charles針對(duì)我們后臺(tái)的地址設(shè)置了SSL Proxying來截取SSL請(qǐng)求,發(fā)現(xiàn)在IOS8下能走到didReceiveChallenge這個(gè)代理

