苹果在WWDC2016上宣布的关于应用强制使用https的规定的解决方案

首先是还算好的好消息

苹果官方表示:强制使用 HTTPS 的要求将暂时不执行,以便给我们更多的时间来做 HTTPS 的适配工作。具体的执行时间,将在确定后再次发布。因此,我们依然可以在 'xxx-Info.plist' 中设置 'App Transport Security Settings' 的 'Allow Arbitrary Loads' 属性设置为yes,来避开ATS要求。这样我们的应用不再需要任何修改就可访问http的网页。


其次是出来混总要还的

首先我们需要把网站配置成支持HTTPS。

苹果的 ATS (App Transport Security) 政策对于HTTPS的要求,包括:

1. X.509证书必须至少满足下面一种条件:

由根证书是操作系统安装的CA颁发;

由用户或系统管理员信任并安装的根证书颁发;

2. TLS版本必须为TLS 1.2,不使用TLS或使用老版本TLS的连接,访问会失败,基于TLSTool工程可获取服务器支持的TLS相关参数;

连接必须使用AES-128或AES-256对称加密算法,TLS协商算法必须通过ECDHE密钥交换保证完全正向保密(Perfect Forward Secrecy, PFS),ECDHE密钥必须属于下面一种:

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

3. 服务器叶证书必须使用下列的密钥签名:

至少2048位的RSA密钥;

至少256位的ECC密钥;


验证网站是否支持苹果的 ATS 要求

对于OS X v10.11及以上系统,用户可以在终端中使用

/usr/bin/nscurl --ats-diagnostics --verbose https://www.baidu.com

来验证目标网站是否符合 ATS 要求,以及是否需要加入白名单。

此外,腾讯云也提供了验证是否符合ATS要求的验证 SSL 网页。


对于无法支持ATS的网站,尤其是第三方网站的适配方案。

首先配置 'xxx-Info.plist' 对于用户的 API 请求,苹果要求是必须使用 HTTPS 的,特别是当这个服务器是属于你们自己管理的话。那么这就需要服务器的同事尽快配置证书好让服务器支持 HTTPS 访问。如果使用的是第三方的 API,而他们没有提供 HTTPS 支持的话,需要在 NSExceptionDomains 中进行添加。具体的添加方式可以参考官方的 App Transport Security Technote,官方对他进行了具体的说明。

这些都可以在 'xxx-Info.plist' 的 ‘NSAppTransportSecurity’ 中进行配置,具体的内容包括

NSAllowsArbitraryLoads - Bool类型 - 设置YES即可完全关闭ATS,以便支持所有HTTP请求,默认为NO。

NSAllowsArbitraryLoadsInWebContent - Bool类型 - 允许应用浏览网页内容时关闭ATS限制。默认为NO,像是 UIWebView 或 WKWebView 需要访问 HTTP 或者不安全的 HTTPS 时,需要设置为YES来允许访问。

NSAllowsArbitraryLoadsForMedia - Bool类型 - 允许该APP的 AVFoundation 中的 player 可以关闭 ATS 限制。默认为NO,如果媒体内容不支持 HTTPS 可打开该关键字。

NSAllowsLocalNetworking - Bool类型 - 设置本地网络请求不受 ATS 的限制,默认为NO。

NSExceptionDomains - Dictionary类型 - 添加白名单域名,对应不同的白名单中的网址设置他们的安全例外内容。需要例外的域名根地址 (不包括 'http://' 或 'https://' 的头和 '/' ) 作为关键字,Dictionary类型,内容为下面的参数。

NSExceptionMinimumTLSVersion - String类型 - 白名单指定域名支持的TLS版本,苹果要求必须达到TLS 1.2版本,如果你访问的网站仅支持TLS 1.0,那么设置为 'TLSv1.0'。

NSExceptionRequiresForwardSecrecy - Bool类型 - 白名单指定域名是否支持Forward Secrecy,默认值为YES,如果域名不支持完全正向加密,那么设置为NO。具体的加密要求可以阅读上方官方技术文档。

NSExceptionAllowsInsecureHTTPLoads - Bool类型 - 白名单指定域名禁用ATS,而不仅仅只是允许HTTP访问,默认是NO。

NSIncludesSubdomains - Bool类型 - 白名单指定该白名单的相关设置是否同样设置它的子域名,默认为NO。


‘SDWebImage’ 无法下载图片的问题。在设置了白名单后,出现部分网上的图片无法通过 ‘SDWebImage’ 进行下载的问题。解决方法是在下载图片时,设置 ‘options’ 为 ‘SDWebImageAllowInvalidSSLCertificates’ 来允许SDWebImage类访问无效的SSL认证。

[self.headImageView sd_setImageWithURL:[NSURL URLWithString:headImageStr] placeholderImage:kCLDefaultHeadImage options:SDWebImageAllowInvalidSSLCertificates];


‘AFNetworking’ 在 ATS 打开情况下,对于无效证书 (像是自建证书) 和不匹配域名的证书可能会请求失败,那么我们需要修改请求的安全要求,来允许无效证书和不匹配域名的证书。

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy defaultPolicy];

//allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO//如果是需要验证自建证书,需要设置为YES

securityPolicy.allowInvalidCertificates = YES;

//validatesDomainName 是否需要验证域名,默认为YES;

securityPolicy.validatesDomainName = NO;

manager.securityPolicy  = securityPolicy;

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

[manager POST:urlString parameters:dic success:finishedBlock failure:failedBlock];


Reference List:

"Supporting App Transport Security", https://developer.apple.com/news/?id=12212016b

"Apple's Information Property List Key Reference", https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html

"苹果ATS(强制HTTPS)审核新政解码", https://yq.aliyun.com/articles/62563

"iOS 中 AFNetworking HTTPS 的使用", http://www.jianshu.com/p/20d5fb4cd76d

"苹果新『应用通信安全』的理解和使用", http://www.cocoachina.com/ios/20150717/12650.html

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

推荐阅读更多精彩内容