使用AFNetWorking进行HTTPS请求

由于iOS 9新特性App Transport Security,我们只能暂时将请求地址设为全部允许或添加白名单

  • 1.默认允许任意HTTP请求
<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>
  • 2.添加键值限制
<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
  <key>NSExceptionDomains</key>
  <dict>
    <key>域名.com</key>
    <dict>
    <!--允许子域名:subdomains-->
    <key>NSIncludesSubdomains</key>
    <true/>
    <!--允许App进行不安全的HTTP请求-->
    <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
    <true/>
    <!--在这里声明所支持的 TLS 最低版本-->
    <key>NSTemporaryExceptionMinimumTLSVersion</key>
    <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>
  • 关于部分Key可参考以下表格
Key 注释
NSAllowsArbitraryLoads 设置true即支持所有HTTP请求
NSExceptionDomains 添加白名单
NSExceptionMinimumTLSVersion 白名单指定域名支持的TLS版本
NSExceptionRequiresForwardSecrecy 白名单指定域名是否支持Forward Secrecy
NSExceptionAllowsInsecureHTTPLoads 白名单指定域名禁用ATS
NSThirdPartyExceptionMinimumTLSVersion 白名单指定第三方服务域名最低支持的TLS版本
NSThirdPartyExceptionRequiresForwardSecrecy 白名单指定第三方服务域名是否支持Forward Secrecy
NSThirdPartyExceptionAllowsInsecureHTTPLoads 白名单指定第三方域名禁用ATS

苹果宣称2017年将全面停止使用不安全的http访问形式,因此以上添加白名单的方式也将弃用

不久的将来我们不得不升级TLS版本以支持https访问,有关于这部分知识这里不详述。下面简单介绍下如何使用AFNetWorking进行HTTPS请求


一般来讲如果app用了web service,我们需要防止数据嗅探来保证数据安全,通常的做法是用ssl来连接以防止数据抓包和嗅探,同时我们还需要防止中间人攻击。攻击者通过伪造的ssl证书使app连接到了伪装的假冒的服务器上。如何解决呢?

首先web服务器必须提供一个ssl证书,需要一个.crt文件,然后设置app只能连接有效ssl证书的服务器。

在开始写代码前,先要把.crt文件转成.cer文件,然后导入项目。

导入.cer文件

  • 方法一

使用openssl将.crt转换成.cer文件

openssl x509 -in XXX.crt -out XXX.cer -outform der
  • 方法二

在mac系统上安装.crt文件,进入钥匙串访问,选中安装好的.crt文件,选择文件->导出项目,保存格式为.cer

之后将其导入Xcode开发的项目,同时,在.plist文件中进行如下设置

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
  <true/>
</dict>

AFN请求

代码部分会使用到AFSecurityPolicy.h这个类,可以看下官方描述:

AFSecurityPolicy evaluates server trust against pinned X.509 certificates and public keys over secure connections.
Adding pinned SSL certificates to your app helps prevent man-in-the-middle attacks and other vulnerabilities. Applications dealing with sensitive customer data or financial information are strongly encouraged to route all communication over an HTTPS connection with SSL pinning configured and enabled.

即得知其用于安全策略认证相关

  • 1.证书路径
NSString * cerPath = [[NSBundle mainBundle] pathForResource:@"XXX" ofType:@"cer"];
NSData * certData = [NSData dataWithContentsOfFile:cerPath];
NSSet * certDataSet = [[NSSet alloc] initWithObjects:certData, nil];
  • 2.安全策略
AFSecurityPolicy * securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
securityPolicy.allowInvalidCertificates = YES;
securityPolicy.validatesDomainName = NO;
securityPolicy.pinnedCertificates = certDataSet;

验证模式AFSSLPinningMode根据需要选择,若不验证证书,则填写AFSSLPinningModeNone,验证.cer则填写AFSSLPinningModeCertificate

AFSSLPinningModeNone,
AFSSLPinningModePublicKey,
AFSSLPinningModeCertificate,

allowInvalidCertificates 允许无效证书(自建证书),默认为NO;若需要验证则修改为YES

validatesDomainName 是否需要验证域名,默认为YES;若为NO,则服务器使用其他可信任机构颁发的证书也可以建立连接,设置不验证主要用于:客户端请求的是子域名,而证书上的是另外一个域名,这种情况下,我们也可以通过注册通配符域名进行验证

pinnedCertificates 验证的证书内容

  • 3.请求

请求部分较为简单,地址和参数视自己的情况而定

AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
manager.securityPolicy = securityPolicy;

NSString * url = @"https://...";

[manager GET:url parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    NSLog(@"%@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    NSLog(@"%@",error);
}];

注:Demo给出了示例代码,具体的证书及地址请根据实际情况修改

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

推荐阅读更多精彩内容