iOS 客户端 HTTPS 防中间人攻击实践

写篇文章介绍些以前在 iOS 客户端实践 HTTPS 安全的经历。

不同工程师写代码的习惯不一样,有些喜欢边写边查,即使在接触陌生的知识域时,也要先写一些代码,遇到难题再去 google 或者 stackoverflow 找答案,另一些则习惯在动手之前,先储备足够多的理论知识,在建立整体认知之后再定框架填细节。我个人建议初学者采用第一种方式,而对于有一定工作年限且寻求专业度提升的工程师来说,后者是更合理的方式。

关于客户端如何实践 HTTPS,所涉及的知识点非常多,如果不预先建立相关知识框架,熟悉背后的理论体系,写出 bug,给队友埋坑可以说是个大概率事件。个人建议可以围绕 PKI 体系和 HTTPS 网络流量分析这两块着手,逐步完善知识细节。

HTTPS 防中间人攻击是 PKI 知识体系的一个应用场景,关键在于明白签名的意义,签名的目的在于身份认证,背后设计的算法理论虽然有些复杂,但整个流程却很直观清晰。

中间人攻击场景涉及三个角色,客户端,服务器,以及 CA(证书签发机构)。CA 主要用来解决 Client 和 Server 之间的信任问题,相当于一个背书的角色。CA 通过签发证书的方式,来确认 Client 和 Server 的身份,具体到 iOS 客户端,CA 一般向 Server 签发证书,告知 Client,持有某个证书的 Server,其身份是可以被信任的。那谁来确认 CA 所说的话是可以被信任的呢?操作系统会内置一些知名 CA 的公钥,这些知名 CA 在签发证书的时候会通过审核确认,确保 Server 的身份和其所宣称的一致。

所有围绕中间人攻击的场景都是根据 CA 来展开的。

一般场景下,iOS 客户端的证书校验逻辑会检查 CA 是否被信任,可以避免中间人攻击。只不过在一些特定场景下会让中间人攻击有机可乘,比如用户自己在 iPhone 上添加可被信任的 CA。之前我写过一篇使用 mitmproxy,实施中间人攻击知乎 iOS 客户端的文章,其原理就是利用用户自己添加 mitimproxy 为可信任 CA,这样 mitmproxy 可以在截获 https 流量之后,进行证书校验的时候,临时签发证书,欺骗证书的校验过程。所以,任何时刻都不要随意添加第三方 CA 信任,这是客户端安全的一道大门。

如果不乱添加第三方 CA,不随意使用网络代理,是否就可以避免中间人攻击呢?凡事无绝对,以前就出现过不少第三方 CA 爆安全漏洞的例子,让攻击者可以签发出来自知名 CA 的证书,这种例子虽然少,却不是没有。

另外,iOS 系统为了加强安全性,降低用户误操作所带来的安全隐患,从 iOS 10.3 开始,将添加证书和信任证书分开处理。即使在用户添加证书之后,还需要在另外一个位置手动开启信任,才能让第三方 CA 获得签发证书被信任的能力,具体位置是:Settings > General > About > Certificate Trust Settings。

对于 iOS 开发者来说,防中间人攻击可以从两方面着手。

第一是通讯内容本身加密,无论是走 http 还是 https,request 和 response 的内容本身都要先做一次加密,这样即使 https 的流量被破解,攻击者还需要再攻破一层加密算法。我们一般使用 AES 256 对内容做加密,这里 AES 密钥的管理也有两种方式,其一是在客户端使用固定的密钥,为了加大破解的难度,我们可以对密钥本身做多次加密处理,使用时再在内存里解密出来真正的密钥。其二是每次会话都使用不同的密钥,原理类似 Forward Secrecy,即使流量被记录,将来被暴力破解,也能极大的增加攻击者破解的时间成本。

第二种就是大家所熟知的 ssl pinning。在客户端进行代码层面的证书校验,校验方式也有两种,一是证书本身校验,而是公钥校验。这两种方式对应到 AFNetworking 中的代码如下:

 enum {
     AFSSLPinningModeNone,
     AFSSLPinningModePublicKey,
     AFSSLPinningModeCertificate,
 }

证书校验是文件级别的校验,客户端只信任若干个证书文件,这些证书文件是和客户端一起打包发布的,这种处理方式要面对的一个问题证书过期问题,为了避免证书过期导致的校验失败,客户端和服务器之间需要额外存在一个证书更新机制,其实做起来也比较简单,只需要服务器下发一个特定的错误码,触发一个客户端的新证书下载流程即可。

公钥校验模式可以免去上述的麻烦,公钥模式只校验证书中所包含的公钥是否匹配,即使证书过期了,只要服务器更新证书,保证公钥不变,依然能完成校验过程,但这个大前提是,服务器的公钥私钥对不能更换。

以上所述都是 https 安全相关的主要知识点,有时候还会遇到一些特殊场景,所以预先建立完整的知识体系十分重要。

比如,有些客户端做了 httpdns,http 请求里是 IP 地址而非域名,这样自然无法通过证书校验环节中的域名匹配,这种时候,我们需要干预证书校验的环节,比如 AFNetworking 允许我们设置 validatesDomainName,NSURLSession 也提供如下方法让我们对证书校验过程做一些特殊处理:

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

所以,先储备好相关理论知识,无论在哪个平台,使用什么第三方库,就都能清晰的做代码层面的 https 安全实践了。

全文完。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336

推荐阅读更多精彩内容