ios AFNetworking支持https请求

来源:互联网 发布:程序员工作量化kpi 编辑:程序博客网 时间:2024/06/05 09:41

ios 9 出来以后,苹果推荐使用https协议,来提高数据传输之间的安全性苹果在2016年6月底发布说要在2017年强制开启ATS,但在24号说为了给用户时间去更新,延期了,但是无论如何早晚搜要使用HTTPS。下面将介绍,如何在工程里面配置,让AF支持https请求.

一.证书准备

  • 1.证书转换
    在服务器人员,给你发送的crt证书后,进到证书路径,执行下面语句
    // openssl x509 -in 你的证书.crt -out 你的证书.cer -outform der
    这样你就可以得到cer类型的证书了。双击,导入电脑。

         如果是pem的证书:

        x509 -inform PEM -outform DER -in certs/terminal.cer -out certs/terminal.cer


  • 2.证书放入工程
    1、可以直接把转换好的cer文件拖动到工程中。
    2、可以在钥匙串内,找到你导入的证书,单击右键,导出项目,就可以导出.cer文件的证书了

二. 代码修改

  • 1先在info.plist中,增加如下图的配置

plist文件配置

使用XML格式配置plist文件内容如下 :

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



使用AFNetworking来支持HTTPS

AFNetworking是iOS/OSX开发最流行的第三方开源库之一, AFNetworking 的安全相关设定放在AFSecurityPolicy。

AFNetworking定义了三种SSLpinningmode:

AFSSLPinningModeNone: 代表客户端无条件地信任服务器端返回的证书

AFSSLPinningModePublicKey : 代表客户端会将服务器端返回的证书与本地保存的证书PublicKey的部分进行校验;如果正确,才继续进行。

AFSSLPinningModeCertificate: 代表客户端会将服务器端返回的证书和本地保存的证书中的所有内容,包括PublicKey和证书部分,全部进行校验;如果正确,才继续进行。

(关于 pinning mode:简单的说就是你可以将SSL证书跟你的 APP 一起打包,藉由此机制来避免中间人伪造SSL证书的风险。)


AFNetworking3.0以上版本

// 支持https, 校验证书,不支持抓包

// 1.初始化单例类     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];    manager.securityPolicy.SSLPinningMode = AFSSLPinningModeCertificate;    // 2.设置证书模式    NSString * cerPath = [[NSBundle mainBundle] pathForResource:@"xxx" ofType:@"cer"];    NSData * cerData = [NSData dataWithContentsOfFile:cerPath];    manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:[[NSSet alloc] initWithObjects:cerData, nil]];    // 客户端是否信任非法证书    mgr.securityPolicy.allowInvalidCertificates = YES;    // 是否在证书域字段中验证域名    [mgr.securityPolicy setValidatesDomainName:NO];
  • 1

//支持https,不校验证书,可以抓包

// 1.初始化单例类     AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];    // 2.设置非校验证书模式    manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];    manager.securityPolicy.allowInvalidCertificates = YES;    [manager.securityPolicy setValidatesDomainName:NO];




0 0
原创粉丝点击