https://github.com/ChenYilong/iOS9AdaptationTips
配置方法 :http://oncenote.com/2014/10/21/Security-1-HTTPS/
HTTPS服務(wù)器信任評估
https://developer.apple.com/library/content/technotes/tn2232/_index.html
?關(guān)于https的簡介和說明我都是參考下面的文章:(謝謝文章作者)
1.http://my.oschina.net/vimfung/blog/494687
2.http://oncenote.com/2014/10/21/Security-1-HTTPS/
3.http://blog.csdn.net/dachao_me/article/details/48624685?ref=myread
最新消息:蘋果關(guān)于接入https的截止時間被延期了汽烦,具體截止時間尚未定甚牲,蘋果推遲https接入截止時間足丢,小伙伴們很魂!別太著急了!
https的說明我就不多說了麸俘,想要了解詳細內(nèi)容查看上面的鏈接楷掉,很多專業(yè)名詞我也不是很明白张吉,只后悔大學(xué)的時候關(guān)于網(wǎng)絡(luò)工程等一些課程沒有好好聽吧!我寫這篇文章主要是為了iOS工程中http轉(zhuǎn)化為https的教程油额。
1.修改info.plist中不安全的http兼容配置
? ? ? ? ? ?目前絕大多數(shù)工作為了解決https的問題叠纷,直接在info.plist中添加配置使得系統(tǒng)的請求類NSURLSession(NSURLConnection)默認的請求方式從https轉(zhuǎn)化為http,
注意:加了這個配置后,http和https都是兼容的潦嘶,如果是https請求涩嚣,會繼續(xù)走https,是http請求會繼續(xù)走http
配置如下:
這種方法只能說治標不治本掂僵,再說蘋果公司也做出了規(guī)定2017年上架的app必須使用https不然可能無法通過審核航厚,所以為了適配https的第一步就是刪除這個配置,講默認請求方式設(shè)置成https看峻。刪除后再次啟動程序會發(fā)現(xiàn)請求全部失敗阶淘,這個錯誤相信大家都很熟悉,沒錯就是因為服務(wù)器不支持https導(dǎo)致的互妓。
2.使用系統(tǒng)的NSURLSession(NSURLConnection)或者第三方的請求框架(AFNetworking)實現(xiàn)https適配
? ? ? 我項目中使用的是AFNetworking 3.1溪窒,所以我先利用AFNetworking做適配(其實AFNetworking的https適配還是利用NSURLSession(NSURLConnection)做的適配,只不過NSURLSession(NSURLConnection)適配有點麻煩冯勉,AFNetworking的適配更加簡單)澈蚌,原本的manager初始化不變,只不過需要為manager的securityPolicy設(shè)置值(不好意思哦灼狰!不知道怎么樣才能添加規(guī)范的代碼宛瞄,只能用截圖來代替了)。
添加完成之后還是出現(xiàn)上面的問題:
檢查后發(fā)現(xiàn)請求的路徑不對交胚,之前都是http份汗,忘記改成https了(請求的路徑一定要跟服務(wù)器開發(fā)人員確定好了),修改完成后還是報錯蝴簇,抓狂1睢!還是很奇葩的錯誤熬词,請求被取消了旁钧,錯誤碼-999吸重,
找了很多資料才發(fā)現(xiàn)還需要站點證書,上面請求失敗可能是因為ssl第一次握手的時候驗證沒通過歪今,然后就直接被取消了嚎幸。所以這時候就需要獲取站點的證書,獲取的方法有兩種:
1.通過openssl命令獲取寄猩,命令如下(以百度為例):
openssl s_client -connect www.baidu.com:443 /dev/null | openssl x509 -outform DER > https1.cer
這個命令的目的就是直接在你的終端打開的當(dāng)前目錄下面下載某一站點的證書嫉晶,但是我怎么都獲取不到下載的證書都是空的,而且終端還報錯焦影,找不到錯誤的原因车遂,沒辦法只能用第二種辦法了
2.直接在瀏覽器中打開項目的任意一個接口的完整路徑,如果你服務(wù)器支持https的話會在鏈接的前面出現(xiàn)一個小鎖的圖標(我使用的是safair瀏覽器)斯辰,點擊小鎖會出現(xiàn)提示點擊顯示證書就會出現(xiàn)站點證書的信息了(以百度為例)舶担,點擊證書的圖標到桌面上就可以把證書下載到桌面上了,這樣就獲取到站點證書了(這種方式不知道會不會存在啥問題彬呻,但是到目前為止我沒遇到啥問題)
獲取到證書后把證書放到項目的mainbundle中衣陶,并用代碼獲取
這時候再跑起來,接口都能獲取到數(shù)據(jù)了闸氮,成功了剪况,不過到這里大家不知道會不會存在疑問,證書這么容易獲取到蒲跨,那別人獲取了怎么辦译断?就算用抓包工具攔截了請求里面的內(nèi)容都是加密的,但是別人可以利用證書向我們服務(wù)器發(fā)請求的或悲,是不是也存在點問題呢孙咪?這個問題我到現(xiàn)在還不是很明白,有的資料說這樣獲取的證書是公鑰巡语,沒有私鑰的話也是白費力氣翎蹈。
3.由于iOS做https適配的時候?qū)Ψ?wù)器是有要求的(一個符合 ATS 要求的 HTTPS),所以出了問題也不一定是客戶端的問題
? ? ? ?其實上面成功了男公,但是還有很多概念不是很清楚荤堪,例如啥叫ATS(App Transport Security),它跟https有啥關(guān)系呢枢赔?
App Transport Security(簡稱ATS)特性, 主要使到原來請求的時候用到的HTTP澄阳,都轉(zhuǎn)向TLS1.2協(xié)議進行傳輸。這也意味著所有的HTTP協(xié)議都強制使用了HTTPS協(xié)議進行傳輸踏拜,ATS是在iOS 9.0 和 OS X v10.11版本中增加的特性待错,使用iOS 9.0或者OS X v10.11的SDK版本(或更新的SDK)進行編譯應(yīng)用時會默認啟動ATS鼻疮。則需要對ATS進行配置粒没。如果使用iOS 9.0或者OS X v10.11之前的SDK版本編譯的應(yīng)用默認是禁止ATS的曲管,因此不會影響應(yīng)用的網(wǎng)絡(luò)連接方面的功能(即使在iOS 9.0的機子上跑也是不影響的)。其實ATS并不單單針對HTTP進行了限制镀琉,對HTTPS也有一定的要求:
首先頒發(fā)給服務(wù)器證書的證書機構(gòu)(CA)的根證書必須是內(nèi)置于操作系統(tǒng)(哪些根證書被信任可以查看https://support.apple.com/zh-cn/HT205205峦嗤,或者在你的機子的設(shè)置-通用-關(guān)于本機最下面的“進一步了解被信任的證書”中查看,百度的CA根證書:)或者受用戶或者系統(tǒng)管理員信任并安裝到操作系統(tǒng)上的屋摔。而且必須要基于TLS 1.2版本協(xié)議(以百度為例烁设,最好使用chrome瀏覽器,其他的瀏覽器我沒找到查看TSL協(xié)議的版本號)钓试。再來就是連接的加密方式要提供Forward Secrecy(FS正向保密装黑,感興趣的筒子可以看看這個https://vincent.bernat.im/en/blog/2011-ssl-perfect-forward-secrecy.html,--弓熏!已經(jīng)打不開了恋谭,支持Forward Secrecy的加密方式
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
),文檔中羅列出了支持的加密算法(上面的原文中有說明挽鞠,我把它獨立抽出來放到下面表格中查看)疚颊。最后就是證書至少要使用一個SHA256的指紋與任一個2048位或者更高位的RSA密鑰,或者是256位或者更高位的ECC密鑰信认。如果不符合其中一項材义,請求將被中斷并返回nil,簡單的說就是下面幾個要求:
1.Transport Layer Security協(xié)議版本要求TLS1.2以上
2.服務(wù)的Ciphers配置要求支持Forward Secrecy等
3.證書簽名算法符合ATS要求等
以上就是一次排查服務(wù)器的https是否符合ATS規(guī)格的方法嫁赏,當(dāng)然也可以使用下面的命令行一次性查詢:輸出結(jié)果都是pass的話就說明鏈接是支持ATS的其掂。
nscurl --ats-diagnostics --verbose https://www.baidu.com
4.由于很多第三方的請求尚未適配https,所以iOS的ATS規(guī)格又分為四大類
1.HTTPS Only (只有HTTPS潦蝇,所有情況下都使用ATS)
顧名思義款熬,這種情況不需要針對某一個域名或者站點做特殊處理,只要服務(wù)器的https符合ATS規(guī)格就可以了
2.Mix & Match(混合)
這種類型主要某些第三方的請求不支持https或者支持的https不符合ATS的情況:
2.1 在info.plist中添加這個配置項后护蝶,ATS當(dāng)與這個子域交互的時候撤銷了必須使用HTTPS的要求(以友盟為例)
2.2 當(dāng)你請求的第三方服務(wù)器支持了https华烟,但是不符合ATS規(guī)格,例如SSL版本低于1.2或者FS加密不符合要求的時候持灰,可以做如下配置:
2.3 NSIncludesSubdomains 關(guān)鍵字告訴 App Transport Security 這個“例外”(Exception)適用于這個特定域名的所有子域盔夜。這個“例外”(Exception)還進一步通過擴展可接受的密碼列表來定義這個域名可以使用不支持forward secrecy( NSExceptionRequiresForwardSecrecy ) 協(xié)議的密碼。想了解更多關(guān)于forward secrecy的信息堤魁,推薦去看官方文檔Apple's tech note
3. Opt Out(禁用ATS)
這個也是目前做法最廣泛的一種方式喂链,把默認的請求的請求方式變成不安全的http,方法上面已經(jīng)說過了妥泉。
4. Opt Out With Exceptions(除特殊情況外椭微,都不使用ATS)
當(dāng)你的應(yīng)用撤消了App Transport Security,,但同時定義了一些“例外”(Exception)盲链,指定了一個或多個“例外”(Exception)來表明哪些是必須要求 App Transport Security的蝇率。