2016年12月21日更新開發(fā)者中心鏈接
https://developer.apple.com/news/?id=12212016b
該鏈接是蘋果昨天剛在官網(wǎng)給的正式回復 如下:
App Transport Security (ATS), introduced in iOS 9 and OS X v10.11, improves user security and privacy by requiring apps to use secure network connections over HTTPS. At WWDC 2016 we announced that apps submitted to the App Store will be required to support ATS at the end of the year. To give you additional time to prepare, this deadline has been extended and we will provide another update when a new deadline is confirmed. Learn more about ATS.
這個東西是為了讓大家放心 17年1月1日 不是蘋果最終的deadline 推遲了跃赚,下面的步驟是iOS前端適配https 的全部步驟 按照步驟配置即可(不要再被網(wǎng)上傳的強制https的文章洗腦了瞄摊,都是ssl證書頒發(fā)機構(gòu)的軟文)
自從2016年的WWDC大會結(jié)束后别凤,就出來個消息說,蘋果方面在2017年1月1日要開始全面支持https了川背,也就是說原來繞過ATS的方法不行了贰拿。沒有取巧的方式那就只能按照正規(guī)的流程來一遍了蛤袒,這幾天把這個坑搞明白了熄云,其實整個過程前端并不需要做太多東西,但是我還是把整個流程熟悉了一遍妙真,這樣也算是蘋果做的一個強制缴允,為整個安全領(lǐng)域推進了一步。
剛開始我也是在網(wǎng)上找了一些教程珍德,但是最后感覺網(wǎng)上的這些流程都或多或少有些問題练般,而且并不能告訴app前端開發(fā)他們到底需要做什么,畢竟大家都是剛開始走這個坑锈候,對這個都不算太了解薄料。所以我把做適配的這段時間走的坑總結(jié)一下。
對于HTTPS和HTTP的對比泵琳,本篇就不再作講解摄职,因為網(wǎng)上有大量的對比,簡單的來說获列,HTTPS相對于HTTP更安全谷市,更安全的原因就來自于多出來這個S----SSL證書
大致適配流程
(1)這里先說整個過程的大體流程,如果你們的公司有運維的同學在击孩,那么先讓運維的同學去看一下正規(guī)大廠用的是什么類型的SSL證書迫悠,額外說一下,現(xiàn)在很多網(wǎng)上有一些免費的證書巩梢,還有國內(nèi)的一些廠商是比較便宜的證書创泄,我不太建議去買這些,因為畢竟這次適配就是為了安全括蝠,不如一步到位验烧。這里就不再介紹自簽名一類的了,自簽名并沒有提升真正的安全度又跛,算是模擬了簽名的過程碍拆。
(2)證書申請成功后,需要后臺的同學配置一下證書,將SSL證書綁定到后臺服務上感混。
(3)前兩步不需要前端的同學完成端幼,前兩步完成后,前端的同學才拿到對應的證書去做前端的適配弧满。如果你們的項目本身就有網(wǎng)絡請求管理類婆跑,那么只需要對管理類相關(guān)的代碼進行修改就行了,如果沒有庭呜,那就需要先封裝一個網(wǎng)絡請求管理類滑进,然后替換之前的所有網(wǎng)絡請求方法(這個過程是反人類的,真希望你用不到這個辦法)
iOS app前端詳細適配流程
先說一下單向認證和雙向認證的區(qū)別:單向認證只要求站點部署了ssl證書就行募谎,任何用戶都可以去訪問(IP被限制除外等)扶关,只是服務端提供了身份認證。而雙向認證則是需要是服務端需要客戶端提供身份認證数冬,只能是服務端允許的客戶能去訪問节槐,安全性相對于要高一些。
其實網(wǎng)上之前我查資料的時候已經(jīng)發(fā)現(xiàn)了拐纱,大部分網(wǎng)上的認證都是雙向認證铜异,但是他們都錯誤的理解其為單向認證了。下面說一下app單向認證具體需要做什么秸架。
單向驗證
//在你封裝的網(wǎng)絡工具類請求前初始化時增加以下代碼
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//設置證書模式揍庄,AFSSLPinningModeNone,代表前端包內(nèi)不驗證
//在單向認證時东抹,前端不放證書蚂子,服務器去驗證
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
// 如果是需要服務端驗證證書,需要設置為YES
securityPolicy.allowInvalidCertificates = YES;
//validatesDomainName 是否需要驗證域名府阀,默認為YES缆镣;
securityPolicy.validatesDomainName = NO;
//設置驗證模式
manager.securityPolicy = securityPolicy;
雙向驗證
雙向驗證的過程我就不說了,因為網(wǎng)上基本全部是雙向認證试浙,需要把證書打包到應用的包里董瞻,這里貼一個比較詳細的鏈接http://www.reibang.com/p/f312a84a944c
這里只把最關(guān)鍵的代碼跟單向認證做一個對比
//在你封裝的網(wǎng)絡工具類請求前初始化時增加以下代
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//設置驗證證書,該模式下許愿把證書打包進項目里田巴,進行驗證
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
//證書的路徑
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"xxx" ofType:@".cer"];
NSData *dataSou = [NSData dataWithContentsOfFile:cerPath];
NSSet *set = [NSSet setWithObjects:dataSou, nil];
securityPolicy.allowInvalidCertificates = YES;
securityPolicy.validatesDomainName = YES;
[securityPolicy setPinnedCertificates:set];
//將驗證方式賦值給管理者
manager.securityPolicy = securityPolicy;
兩類驗證方式的最大區(qū)別其實在于钠糊,是否需要把證書打包進入應用內(nèi)。
跟著這個問題隨之而來的就有另外的幾個問題壹哺,對于app前端開發(fā)來說抄伍,究竟選擇何種驗證方式比較好呢。其實對于app來說管宵,單向驗證是最方便的截珍,也是安全的攀甚,雙向驗證比單向來說更安全,但是對于app開發(fā)來說有幾個問題需要面對岗喉。所以下面列一下單向和雙向的優(yōu)點和缺點秋度,你可以選擇最合適的方式來處理。
單向優(yōu)點
1.更加靈活钱床,客戶端不需要把相應證書打包進入app內(nèi)荚斯,這個SSL證書是有過期時間的,如果過期了查牌,只需要服務器端修改證書即可事期,不會出現(xiàn)突然有一天莫名其妙app打不開了的問題。
2.雖然兩種驗證方法對于前端來說并沒有太多工作了纸颜,但是相對來說單向?qū)τ诜斩撕颓岸藖碚f更簡單兽泣。
雙向優(yōu)點
1.更加安全。但是相對來說開發(fā)成本更高
對比之后懂衩,我們的app最終選擇單向驗證的方式撞叨。更多的是為了避免如果修改了證書的廠家這種意外事件的處理金踪,避免不必要的麻煩浊洞。
總結(jié)
其實對于前端來說,并沒有太多的工作量胡岔,重點是對于整個過程的理解和方式的選擇法希。所以也不要害怕17年的全面https的問題。
下面是我自己個人的疑問靶瘸,因為不確定明年的plist里面的ATS是不是在提交應用的時候Allow Arbitrary Loads是不是必須不要設置或者設置為NO,所以我在前幾天向蘋果開發(fā)者中心發(fā)了一個郵件苫亦,得到的結(jié)果真是出人意料
這個回復真是哭笑不得,一邊提倡https 一邊說現(xiàn)在還沒有對開發(fā)者做限制怨咪。不過管他呢屋剑,https是一個趨勢,先做了诗眨,一步到位就行唉匾,明年的Allow Arbitrary Loads 照樣上傳應用的時候設置YES了,17年1月1日到底蘋果是不是強制要求不讓這么繞過匠楚,也不能確定巍膘。
這個坑過去了,但是ATS是對UIWebView和WKWebView有影響的芋簿,如果Allow Arbitrary Loads設置為NO, Allow Arbitrary Loads in Web Content不設置峡懈,那么UIWebView和WKWebView不能正常的顯示,因為加載網(wǎng)頁也是需要基于http和https協(xié)議的与斤。所以需要將Allow Arbitrary Loads in Web Content設置為YES肪康。
這塊的問題都在摸索荚恶,如果有我與理解不到位的地方,希望能在評論中給我提意見磷支,謝謝裆甩,互相學習。