因為2017年開始逸雹,蘋果官方要求必須支持Https,ATS允許http加載 策略將被關(guān)閉筷转。所以最近許多小伙伴應(yīng)該都在為適配而忙著搜集資料筐喳。最開始看一些關(guān)于證書的東西催式,自己也是一臉懵逼”芄椋看了好幾遍荣月,才大致懂了一點點。自己還去創(chuàng)建了證書梳毙,搭建了tomcat進行調(diào)試哺窄。雖然忙了半天效果不顯著,但是略有收獲账锹,會進行tomcat簡單配置環(huán)境了(竊喜:只要有進步都是好的)萌业。不扯了,進入正題奸柬。
首先生年,一般小伙伴剛看到要適配的時候,一般會去查證書相關(guān)信息廓奕,其實先不用管證書問題抱婉,等后臺配置好了,給你個證書就行了(我可沒有甩鍋給后臺懂从,主要自己要先把客戶端配置好授段,聯(lián)調(diào)最主要,也耗費時間番甩,有時間了再詳細了解證書)。
第一種最簡單方式届搁,后臺配置完成后缘薛,客戶端直接把請求改為https窍育,ATS中Allow Arbitrary Loads改為NO,一行代碼沒有修改,驚奇的發(fā)現(xiàn)宴胧,居然可以請求了漱抓。是不是很竊喜,暗自感嘆So easy! 小伙子高興的太早了恕齐。這種方式我理解為掛著https的旗幟乞娄,實際還是http。別人還是可以隨意的看你請求數(shù)據(jù)和返回數(shù)據(jù)显歧∫腔颍可能有的小伙伴這時候有疑問了,用charles抓包時候發(fā)現(xiàn)士骤,是沒辦法抓到數(shù)據(jù)范删,顯示的是unkown,看返回數(shù)據(jù)是亂碼,猿(樓主)又在瞎說了。
這是因為你沒有啟用SSL 代理拷肌。右擊你的請求url到旦,就會彈出選擇框,點擊Enable SSL Proxying巨缘。
至于這塊charles的配置添忘,在此我就不詳細解釋了,有時間了再補充一下若锁。自己查詢一下資料,主要就是手機添加charles ssl證書搁骑,然后就可以看到跟請求http 一樣可以抓取數(shù)據(jù)了,所以樓主說只是掛了https 的牌子拴清,沒有做具體的事情靶病。至于蘋果是否能夠?qū)徍送ㄟ^,我也就不清楚了口予,反正樓主不當?shù)谝粋€吃螃蟹的人(因為程序員要降低被拒風險)娄周。
第二種方式,腳踏實地沪停,一步一個腳印煤辨。先上代碼:
+ (AFSecurityPolicy*)customSecurityPolicy
{
//先導(dǎo)入證書
NSString *cerPath = [[NSBundle mainBundle] pathForResource:certificate ofType:@"cer"];//證書的路徑
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
// AFSSLPinningModeCertificate 使用證書驗證模式
//AFSSLPinningModeNone: 代表客戶端無條件地信任服務(wù)器端返回的證書。
//AFSSLPinningModePublicKey: 代表客戶端會將服務(wù)器端返回的證書與本地保存的證書中木张,PublicKey的部分進行校驗众辨;如果正確,才繼續(xù)進行舷礼。
//AFSSLPinningModeCertificate: 代表客戶端會將服務(wù)器端返回的證書和本地保存的證書中的所有內(nèi)容鹃彻,包括PublicKey和證書部分,全部進行校驗妻献;如果正確蛛株,才繼續(xù)進行团赁。
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
// allowInvalidCertificates 是否允許無效證書(也就是自建的證書),默認為NO
// 如果是需要驗證自建證書谨履,需要設(shè)置為YES
securityPolicy.allowInvalidCertificates = YES;
//validatesDomainName 是否需要驗證域名欢摄,默認為YES;
//假如證書的域名與你請求的域名不一致笋粟,需把該項設(shè)置為NO怀挠;如設(shè)成NO的話,即服務(wù)器使用其他可信任機構(gòu)頒發(fā)的證書害捕,也可以建立連接绿淋,這個非常危險,建議打開吨艇。
//置為NO躬它,主要用于這種情況:客戶端請求的是子域名,而證書上的是另外一個域名东涡。因為SSL證書上的域名是獨立的冯吓,假如證書上注冊的域名是www.google.com,那么mail.google.com是無法驗證通過的疮跑;當然组贺,有錢可以注冊通配符的域名*.google.com,但這個還是比較貴的祖娘。
//如置為NO,建議自己添加對應(yīng)域名的校驗邏輯渐苏。
//對應(yīng)域名的校驗我認為應(yīng)該在url中去邏輯判斷。--》馮龍騰寫
securityPolicy.validatesDomainName = NO;
if (certData) {
securityPolicy.pinnedCertificates = [NSSet setWithObjects:certData, nil];
}
return securityPolicy;
}
這部分代碼是配置驗證策略琼富,摘自馮龍騰(雖然不知道哪位大神,還是要謝謝這么詳細的注釋鞠眉。)然后把返回的securityPolicy賦值給AFHTTPSessionManager的securityPolicy屬性。有時間的朋友出皇,可以看看AFN源碼了解一下底層驗證策略哗戈。其實第一種方式郊艘,只添加了https請求,然后什么代碼也沒添加的方式步做,采取的是AFN 默認驗證策略
[AFSecurityPolicy defaultPolicy];
所以不用驚訝為啥能走的通副渴,只不過采取的驗證方式不同奈附。這時候就可以跟后臺要證書煮剧,進行聯(lián)調(diào)了。
一般只要證書沒有問題勉盅,并且后臺支持了https,走通網(wǎng)絡(luò)請求挑胸,應(yīng)該問題不大。最開始我們使用的是自建證書茬贵,后臺使用keytool生成證書,當時前端和后臺使用的是同一個證書解藻,看AFN源碼過程中,發(fā)現(xiàn)驗證過程如果證書一致螟左,也是可以正常請求的觅够。但是不是CA證書,繼續(xù)改進喘先,使用openssl創(chuàng)建了自建的CA證書。自建CA證書和授權(quán)CA證書苹祟,最大的區(qū)別,也是最簡單的區(qū)別树枫,就是你用瀏覽器訪問時候,自建證書會顯示不是私密鏈接奔誓,點擊高級,繼續(xù)進行訪問厨喂,提示你不安全信息。
而授權(quán)CA證書蜕煌,則可以直接正常訪問
使用自建證書的時候斜纪,允許使用自建證書設(shè)置為YES,
securityPolicy.allowInvalidCertificates = YES;
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
當時這種情況我是沒有走通的,難道是沒有授權(quán)允許繼續(xù)訪問按鈕盒刚?這就尷尬了,沒太多的時間去管這個了因块,跟后臺大哥說,咱還是用授權(quán)的CA證書吧趾断,后臺大哥說吓懈,授權(quán)CA證書得money啊,一臉的不情愿耻警,好在一不小心看到阿里有個可以申請免費的CA證書,當時我是淚流滿面甘穿。證書搞定,然后聯(lián)調(diào)一切正常秸滴。
這還沒完募判,要記得把自己用的第三方荡含,友盟統(tǒng)計届垫,shareSDK,推送误债,熱部署JSPatch等等,更新到支持Https寝蹈,如果有不支持https 請求的李命,要加入白名單(不知道蘋果審核允許不允許箫老,但是目前沒想到好的方式)。還有網(wǎng)頁請求周叮,也要注意一下界斜。配置結(jié)束以后,用charles 抓包各薇,查看一下有沒有請求失敗的,如果有峭判,核查哪一部分的問題棕叫。
最后提醒一下,授權(quán)證書是有過期時間的俺泣,要做好更新證書策略,策略問題横漏,目前我們已經(jīng)處理完了,每個公司不同缎浇,自己可以想一個比較完善的策略赴肚。希望大家的APP能夠順利上架。如果有理解不對的地方誉券,請指出,不斷學(xué)習(xí)進步的小碼農(nóng)横朋。