其他不扯,看代码

使用AFNetworking3.0版本之后:

- (void)btnAction {//初始化AFHTTPSessionManagerNSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];self.sessinonManager = [[AFHTTPSessionManager alloc]initWithBaseURL:[NSURL URLWithString:@"https://www.songchunmin.com:8443/test_service/"]sessionConfiguration:sessionConfig];AFHTTPRequestSerializer *afHTTPRequestSerializer = [AFHTTPRequestSerializer serializer];afHTTPRequestSerializer.timeoutInterval = 30;_sessinonManager.requestSerializer = afHTTPRequestSerializer;AFJSONResponseSerializer *responseSerializer = [AFJSONResponseSerializer serializer];responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",@"text/json", nil];_sessinonManager.responseSerializer = responseSerializer;//https 配置证书NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"songchunmin" ofType:@"cer"];//证书的路径NSData *certData = [NSData dataWithContentsOfFile:cerPath];// AFSSLPinningModeCertificate 使用证书验证模式AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];// allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO// 如果是需要验证自建证书,需要设置为YESsecurityPolicy.allowInvalidCertificates = YES;/*validatesDomainName 是否需要验证域名,默认为YES;假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。如置为NO,建议自己添加对应域名的校验逻辑。*/securityPolicy.validatesDomainName = NO;securityPolicy.pinnedCertificates = [NSSet setWithObject:certData];[_sessinonManager setSecurityPolicy:securityPolicy];[_sessinonManager GET:@"servlet/AppServlet" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {NSLog(@"responseObject:%@",responseObject);} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {NSLog(@"responseObject:%@",error);}];}

使用AFNetworking3.0版本之前:

+ (AFSecurityPolicy*)customSecurityPolicy
{// /先导入证书NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"hgcang" ofType:@"cer"];//证书的路径NSData *certData = [NSData dataWithContentsOfFile:cerPath];// AFSSLPinningModeCertificate 使用证书验证模式AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];// allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO// 如果是需要验证自建证书,需要设置为YESsecurityPolicy.allowInvalidCertificates = YES;//validatesDomainName 是否需要验证域名,默认为YES;//假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。//置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。//如置为NO,建议自己添加对应域名的校验逻辑。securityPolicy.validatesDomainName = NO;securityPolicy.pinnedCertificates = @[certData];return securityPolicy;
}
+ (void)post:(NSString *)url params:(NSDictionary *)params success:(void (^)(id))success failure:(void (^)(NSError *))failure
{// 1.获得请求管理者AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];// 2.申明返回的结果是text/html类型mgr.responseSerializer = [AFHTTPResponseSerializer serializer];// 加上这行代码,https ssl 验证。//[mgr setSecurityPolicy:[self customSecurityPolicy]];// 3.发送POST请求[mgr POST:url parameters:paramssuccess:^(AFHTTPRequestOperation *operation, id responseObj) {if (success) {success(responseObj);}} failure:^(AFHTTPRequestOperation *operation, NSError *error) {if (failure) {failure(error);}}];
}

---------------------------------------理论指导实践----------------------------------------------------

HTTPS

HTTPS就是将HTTP协议数据包放到SSL/TSL层加密后,在TCP/IP层组成IP数据报去传输,以此保证传输数据的安全;而对于接收端,在SSL/TSL将接收的数据包解密之后,将数据传给HTTP协议层,就是普通的HTTP数据。HTTP和SSL/TSL都处于OSI模型的应用层。

App Transport Security

iOS9中新增App Transport Security(简称ATS)特性, 主要使到原来请求的时候用到的HTTP,都转向TLS1.2协议进行传输。这也意味着所有的HTTP协议都强制使用了HTTPS协议进行传输。

一般我们如果还是使用的http,不更新的话,可通过在 Info.plist 中声明,倒退回不安全的网络请求。

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

但是如果我们要用https的话,也要注意的

These are the App Transport Security requirements:

  • The protocol Transport Security Layer (TLS) must be at least version 1.2.
  • Connection ciphers are limited to those that provide forward secrecy (see the list of ciphers below.)
  • Certificates must use at least an SHA256 fingerprint with either a 2048 bit or greater RSA key, or a 256 bit or greater Elliptic-Curve (ECC) key.

根据原文描述,首先必须要基于TLS 1.2版本协议。再来就是连接的加密方式要提供Forward Secrecy,文档中罗列出支持的加密算法(如下表)。最后就是证书至少要使用一个SHA256的指纹与任一个2048位或者更高位的RSA密钥,或者是256位或者更高位的ECC密钥。如果不符合其中一项,请求将被中断并返回nil。

  • 第一条就是TLS版本所需要支持的协议

  • 第一条就是连接的加密方式需要提供“Foward Secrecy”这个东东,下面是支持Forward Secrecy的加密方式

      TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA`TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256`TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHATLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

这是一个满足条件的证书信息中的情况

但是也要注意证书的合法性,注意是否有效,iOS要求连接的HTTPS站点必须为CA签名过的合法证书。

注意以上不同的情况决定了AFSecurityPolicy--setAllowInvalidCertificates:是否要验证证书的有效性。

使用AFNetworking中https的连接(3.0.0之前)
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];AFSecurityPolicy *securityPolicy = [AFSecurityPolicy defaultPolicy];//allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO//如果是需要验证自建证书,需要设置为YESsecurityPolicy.allowInvalidCertificates = YES;//validatesDomainName 是否需要验证域名,默认为YES;  securityPolicy.validatesDomainName = YES;manager.securityPolicy  = securityPolicy;manager.responseSerializer = [AFHTTPResponseSerializer serializer];[manager POST:urlString parameters:dic success:finishedBlock failure:failedBlock];

但是刚开始一直不行,不能正常访问数据

  • 第一个错是我打开 Clarles,忘记关了
  • 老出现`Error: Error Domain=NSURLErrorDomain Code=-1012

第二种情况,在google逛了一大圈,试着好几种方法居然不行,

转载于:https://www.cnblogs.com/songchunmin/p/7789721.html

Https iOS需要做的事相关推荐

  1. 做爱做的事,做有快感的事

    还是不发首页了,最近没规划,需要缓一缓.因为发首页还是要符合几点要求的,所以就先停停,不过文章还是得写. 本来十一点多就写好了,没想到洗个澡就过了十二点. ---------------------- ...

  2. 最近想读的书想做的事

    越来越多了,但是总是还没开始,一天拿出一小时,周末拿出一上午.加油加油 2012/3/27 C标准库 C专家编程Expert C Programming Deep C Secrets CodeCraf ...

  3. 技术管理角色认知-管理都需要做哪些事

    背景 即管理的具体形式,关于what的问题?管理到底要做哪些事情? 派别 定义 说明 过程 管理是5个要素组成的一种普遍的人类活动,这5个要素是:计划,组织,指挥,协调,控制 亨利法约尔 目标和方法 ...

  4. 学习方向、当前要做的事

    学习方向 算法: 1.字符串匹配的三个算法(KMP+字典树+AC自动机)(100%) 2.KNN邻近分类算法 3.聚类算法 4.决策树算法 5.后缀数组 6.diff算法原理 前端: webpackl ...

  5. 转:程序员每天该做的事

    程序员每天该做的事 1.总结自己一天任务的完成情况 最好的方式是写工作日志,把自己今天完成了什么事情,遇见了什么问题都记录下来,日后翻看好处多多 >> 好记性不如烂笔头.呵呵 2.考虑自己 ...

  6. 前后端分离后的前端时代,使用前端技术能做哪些事?

    什么是前后端分离,要区分前端和后端,需要有个明确的界限.一般,用户可以直接看到的东西,都是属于前端的范畴,除了前端之外都属于后端了. 在传统的像ASP,JSP和PHP等开发模式中,前端是处在一个混沌的 ...

  7. 努力只是因为想去做想做的事

    努力只是因为想去做想做的事 最初的梦想紧握在手上,最想要去的地方,怎么能在半路就返航. 记得在写About Me的时候有一个TO DO,上面写着: 设计师 自由职业者 Dream-Coastline ...

  8. 人工智能离不开“人工投喂”数据,现在中国约有 100 万人做这事

    听到"喵喵"想到猫,听到"汪汪"想到狗--理解所听所闻是智力认知正常人类的天赋.计算机如果要实现类似的"技能"就需要借助"神经网络 ...

  9. 从《战狼2》看吴京:选对方向、做对事

    这几天被<战狼2>刷屏了,朋友圈里观影过的人在给予好评或者是转载相关文章,各媒体争相报道相关内容,曾上人民日报客户端首页,更是出现在央视的新闻联播里. 先来看几个数字: 27日首映4小时横 ...

最新文章

  1. 机器学习-----有监督,无监督,半监督学习的简单阐释
  2. Goolge新AI算法实时生成3D场景 | 可下载
  3. 【Flutter】Hero 动画 ( Hero 实现径向动画 | Hero 组件 createRectTween 设置 )
  4. drupal与html转换,老葛 怎么改变drupal form 生成的html啊 ? | Think in Drupal
  5. sklearn svm
  6. 投屏连接台式计算机,笔记本如何连接一体电脑进行投屏?
  7. Elasticsearch –使用模式替换过滤器和自定义分析器忽略查询中的特殊字符
  8. python管理系统web版_Python学生管理系统(web网页版)-Go语言中文社区
  9. 在图片中选定任意凸多边形制作掩膜程序MATLAB
  10. 喜欢去知乎炸鱼?用python吧
  11. SLF4J 与Log4J
  12. linux下查看日志基本命令
  13. linux进程状态a,Linux进程状态标识符含义
  14. php概率算法(转)
  15. LayUI使用distpicker.js插件实现三级联动
  16. linux查找文件夹名称
  17. 数字货币主流币是什么意思?三分钟读懂数字货币主流币
  18. 使用vue扫描扫描仪图像
  19. td-agent windows 安装步骤
  20. 单片机c语言sfr数据读,单片机c语言的sbit和sfr.docx

热门文章

  1. 在 Kali Linux 中更改 GRUB2 背景的 5 种方式
  2. Ubuntu快速搭建Jenkins持续集成平台
  3. 初学Python之利用map编写姓名格式化输出函数
  4. OAF_VO系列3 - Binding Style绑定方式
  5. 详细介绍MPLS路由协议的相关概念知识
  6. java字符串怎么拼接字符串_Java中String使用+ 拼接字符串的原理是什么?
  7. 首次安装Linux,配置网络、换源一步到位
  8. 蓝桥杯 ALGO-25 算法训练 Car的旅行路线
  9. 蓝桥杯 ALGO-112 算法训练 暗恋
  10. PAT 1082. 射击比赛 (20) - 乙级