iOS 客戶端 HTTPS 防中間人攻擊實踐

寫篇文章介紹些以前在 iOS 客戶端實踐 HTTPS 安全的經(jīng)歷描孟。

不同工程師寫代碼的習(xí)慣不一樣,有些喜歡邊寫邊查砰左,即使在接觸陌生的知識域時匿醒,也要先寫一些代碼,遇到難題再去 google 或者 stackoverflow 找答案缠导,另一些則習(xí)慣在動手之前廉羔,先儲備足夠多的理論知識,在建立整體認(rèn)知之后再定框架填細(xì)節(jié)僻造。我個人建議初學(xué)者采用第一種方式憋他,而對于有一定工作年限且尋求專業(yè)度提升的工程師來說,后者是更合理的方式髓削。

關(guān)于客戶端如何實踐 HTTPS竹挡,所涉及的知識點非常多,如果不預(yù)先建立相關(guān)知識框架立膛,熟悉背后的理論體系揪罕,寫出 bug,給隊友埋坑可以說是個大概率事件。個人建議可以圍繞 PKI 體系和 HTTPS 網(wǎng)絡(luò)流量分析這兩塊著手耸序,逐步完善知識細(xì)節(jié)忍些。

HTTPS 防中間人攻擊是 PKI 知識體系的一個應(yīng)用場景,關(guān)鍵在于明白簽名的意義坎怪,簽名的目的在于身份認(rèn)證罢坝,背后設(shè)計的算法理論雖然有些復(fù)雜,但整個流程卻很直觀清晰搅窿。

中間人攻擊場景涉及三個角色嘁酿,客戶端,服務(wù)器男应,以及 CA(證書簽發(fā)機構(gòu))闹司。CA 主要用來解決 Client 和 Server 之間的信任問題,相當(dāng)于一個背書的角色沐飘。CA 通過簽發(fā)證書的方式游桩,來確認(rèn) Client 和 Server 的身份,具體到 iOS 客戶端耐朴,CA 一般向 Server 簽發(fā)證書借卧,告知 Client,持有某個證書的 Server筛峭,其身份是可以被信任的铐刘。那誰來確認(rèn) CA 所說的話是可以被信任的呢?操作系統(tǒng)會內(nèi)置一些知名 CA 的公鑰影晓,這些知名 CA 在簽發(fā)證書的時候會通過審核確認(rèn)镰吵,確保 Server 的身份和其所宣稱的一致。

所有圍繞中間人攻擊的場景都是根據(jù) CA 來展開的挂签。

一般場景下疤祭,iOS 客戶端的證書校驗邏輯會檢查 CA 是否被信任,可以避免中間人攻擊饵婆。只不過在一些特定場景下會讓中間人攻擊有機可乘画株,比如用戶自己在 iPhone 上添加可被信任的 CA。之前我寫過一篇使用 mitmproxy啦辐,實施中間人攻擊知乎 iOS 客戶端的文章谓传,其原理就是利用用戶自己添加 mitimproxy 為可信任 CA,這樣 mitmproxy 可以在截獲 https 流量之后芹关,進(jìn)行證書校驗的時候续挟,臨時簽發(fā)證書,欺騙證書的校驗過程侥衬。所以诗祸,任何時刻都不要隨意添加第三方 CA 信任跑芳,這是客戶端安全的一道大門。

如果不亂添加第三方 CA直颅,不隨意使用網(wǎng)絡(luò)代理博个,是否就可以避免中間人攻擊呢?凡事無絕對功偿,以前就出現(xiàn)過不少第三方 CA 爆安全漏洞的例子盆佣,讓攻擊者可以簽發(fā)出來自知名 CA 的證書,這種例子雖然少械荷,卻不是沒有共耍。

另外,iOS 系統(tǒng)為了加強安全性吨瞎,降低用戶誤操作所帶來的安全隱患痹兜,從 iOS 10.3 開始,將添加證書和信任證書分開處理颤诀。即使在用戶添加證書之后字旭,還需要在另外一個位置手動開啟信任,才能讓第三方 CA 獲得簽發(fā)證書被信任的能力崖叫,具體位置是:Settings > General > About > Certificate Trust Settings谐算。

對于 iOS 開發(fā)者來說,防中間人攻擊可以從兩方面著手归露。

第一是通訊內(nèi)容本身加密,無論是走 http 還是 https斤儿,request 和 response 的內(nèi)容本身都要先做一次加密剧包,這樣即使 https 的流量被破解,攻擊者還需要再攻破一層加密算法往果。我們一般使用 AES 256 對內(nèi)容做加密疆液,這里 AES 密鑰的管理也有兩種方式,其一是在客戶端使用固定的密鑰陕贮,為了加大破解的難度堕油,我們可以對密鑰本身做多次加密處理,使用時再在內(nèi)存里解密出來真正的密鑰肮之。其二是每次會話都使用不同的密鑰掉缺,原理類似 Forward Secrecy,即使流量被記錄戈擒,將來被暴力破解眶明,也能極大的增加攻擊者破解的時間成本。

第二種就是大家所熟知的 ssl pinning筐高。在客戶端進(jìn)行代碼層面的證書校驗搜囱,校驗方式也有兩種丑瞧,一是證書本身校驗,而是公鑰校驗蜀肘。這兩種方式對應(yīng)到 AFNetworking 中的代碼如下:

 enum {
     AFSSLPinningModeNone,
     AFSSLPinningModePublicKey,
     AFSSLPinningModeCertificate,
 }

證書校驗是文件級別的校驗绊汹,客戶端只信任若干個證書文件,這些證書文件是和客戶端一起打包發(fā)布的扮宠,這種處理方式要面對的一個問題證書過期問題西乖,為了避免證書過期導(dǎo)致的校驗失敗,客戶端和服務(wù)器之間需要額外存在一個證書更新機制涵卵,其實做起來也比較簡單浴栽,只需要服務(wù)器下發(fā)一個特定的錯誤碼,觸發(fā)一個客戶端的新證書下載流程即可轿偎。

公鑰校驗?zāi)J娇梢悦馊ド鲜龅穆闊┑浼Γ€模式只校驗證書中所包含的公鑰是否匹配,即使證書過期了坏晦,只要服務(wù)器更新證書萝玷,保證公鑰不變,依然能完成校驗過程昆婿,但這個大前提是球碉,服務(wù)器的公鑰私鑰對不能更換。

以上所述都是 https 安全相關(guān)的主要知識點仓蛆,有時候還會遇到一些特殊場景睁冬,所以預(yù)先建立完整的知識體系十分重要。

比如看疙,有些客戶端做了 httpdns豆拨,http 請求里是 IP 地址而非域名,這樣自然無法通過證書校驗環(huán)節(jié)中的域名匹配能庆,這種時候施禾,我們需要干預(yù)證書校驗的環(huán)節(jié),比如 AFNetworking 允許我們設(shè)置 validatesDomainName搁胆,NSURLSession 也提供如下方法讓我們對證書校驗過程做一些特殊處理:

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler
{}

所以弥搞,先儲備好相關(guān)理論知識,無論在哪個平臺渠旁,使用什么第三方庫攀例,就都能清晰的做代碼層面的 https 安全實踐了。

全文完顾腊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肛度,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子投慈,更是在濱河造成了極大的恐慌承耿,老刑警劉巖冠骄,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異加袋,居然都是意外死亡凛辣,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門职烧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扁誓,“玉大人,你說我怎么就攤上這事蚀之』雀遥” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵足删,是天一觀的道長寿谴。 經(jīng)常有香客問我,道長失受,這世上最難降的妖魔是什么讶泰? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮拂到,結(jié)果婚禮上痪署,老公的妹妹穿的比我還像新娘。我一直安慰自己兄旬,他們只是感情好狼犯,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著领铐,像睡著了一般悯森。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上罐孝,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音肥缔,去河邊找鬼莲兢。 笑死,一個胖子當(dāng)著我的面吹牛续膳,可吹牛的內(nèi)容都是我干的改艇。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼坟岔,長吁一口氣:“原來是場噩夢啊……” “哼谒兄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起社付,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤承疲,失蹤者是張志新(化名)和其女友劉穎邻耕,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體燕鸽,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡兄世,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了啊研。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片御滩。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖党远,靈堂內(nèi)的尸體忽然破棺而出削解,到底是詐尸還是另有隱情,我是刑警寧澤沟娱,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布氛驮,位于F島的核電站,受9級特大地震影響花沉,放射性物質(zhì)發(fā)生泄漏柳爽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一碱屁、第九天 我趴在偏房一處隱蔽的房頂上張望磷脯。 院中可真熱鬧,春花似錦娩脾、人聲如沸赵誓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽俩功。三九已至,卻和暖如春碰声,著一層夾襖步出監(jiān)牢的瞬間诡蜓,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工胰挑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蔓罚,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓瞻颂,卻偏偏與公主長得像豺谈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贡这,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容