43.https自建证书在 AFN中的设置
2016-03-17 19:56
591 查看
介绍
首先是网络安全,OSI模型各层都会面临相应的网络安全问题,涉及宽广,而网络安全也是安全领域发展最为繁荣的领域。本文我们只是从移动应用开发角度,以尽量简单的方式,讲解HTTPS核心概念知识,以及在iOS平台上的实现。建议现在还在使用HTTP的应用都升级到HTTPS。其实HTTPS从最终的数据解析的角度,与HTTP没有任何的区别,HTTPS就是将HTTP协议数据包放到SSL/TSL层加密后,在TCP/IP层组成IP数据报去传输,以此保证传输数据的安全;而对于接收端,在SSL/TSL将接收的数据包解密之后,将数据传给HTTP协议层,就是普通的HTTP数据。HTTP和SSL/TSL都处于OSI模型的应用层。
处理
当 https 请求时,需要有证书,证书是后台服务器上后台人员上传上去的. 对于此证书有两种,一种是购买的第三方信任签名证书,一种是自签名的证书.对于购买证书,直接改成https应该就可以了,如果是自签名证书需要做一些的处理1.在自己封装的 AFNClient的类中添加宏#define AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES
2.在封装的单例进行配置AFHTTPRequestOperationManager时,要进行AFSecurityPolicy的设置.
AFSecurityPolicy * securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; //allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO //如果是需要验证自建证书,需要设置为YES securityPolicy.allowInvalidCertificates = YES; //validatesDomainName 是否需要验证域名,默认为YES; //假如证书的域名与你请求的域名不一致,需把该项设置为NO //主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。 securityPolicy.validatesDomainName = NO; //validatesCertificateChain 是否验证整个证书链,默认为YES //设置为YES,会将服务器返回的Trust Object上的证书链与本地导入的证书进行对比,这就意味着,假如你的证书链是这样的: //GeoTrust Global CA // Google Internet Authority G2 // *.google.com //那么,除了导入*.google.com之外,还需要导入证书链上所有的CA证书(GeoTrust Global CA, Google Internet Authority G2); //如是自建证书的时候,可以设置为YES,增强安全性;假如是信任的CA所签发的证书,则建议关闭该验证; securityPolicy.validatesCertificateChain = NO; requestOperationManager.securityPolicy = securityPolicy;
不过, 在加入以上代码后, 可能还会不能与服务器进行连接, 而且可能报错:
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)或者
Error Domain=NSURLErrorDomain Code=-1202 “The certificate for this server is invalid. ”
你可以尝试在你的请求类中加入以下代码:
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * __nullable credential))completionHandler{ NSLog(@"didReceiveChallenge"); // if([challenge.protectionSpace.host isEqualToString:@"api.lz517.me"] /*check if this is host you trust: */ ){ completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]); // } }
加入代码后本人遇到的问题就解决了, 但是如果你的请求还有问题你可以参考以下,
和这个问题 http://stackoverflow.com/questions/33827351/how-to-solve-this-nsurlsession-nsurlconnection-http-load-failed-kcfstreamerrord
这里也推荐一篇文章是关于 ATS 的: App Transport Security(ATS)
相关文章推荐
- Android架构:用消息机制获取网络数据
- 42.打造安全的App!iOS安全系列之 HTTPS
- React-Native中网络请求的总结
- centos系统中perl进程病毒占用大量网络流量导致网络瘫痪的问题分析及解决方案
- centos系统中perl进程病毒占用大量网络流量导致网络瘫痪的问题分析及解决方案
- IOS 网络浅析(一 网络监测~Reachability-master)
- 404、500、502等HTTP状态码介绍
- HTTP 1.1状态代码及其含义
- 系统运维和网络运维技能对比
- 微信支付(转载http://www.cnblogs.com/jys509/p/5130990.html)
- iOS开发——Reachability和AFNetworking判断网络连接状态
- golang中发送http请求的几种常见情况
- OSI七层模型与TCP/IP四层模型
- 安卓学习_基于TCP协议的网络通信
- 网络通信编程
- java发送http的get、post请求
- golang入门--一个简单的http client
- Socket编程:TCP客户端/服务器应用程序
- 探究TCP
- HTTP服务端接口模拟工具-HttpServerMockTool