您的位置:首页 > 理论基础 > 计算机网络

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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: