近期很多客户咨询如何链接HTTPS, 今天特意做了一个简单的演示DEMO,仅供参考。
AFSecurityPolicy相关的配置
SSLPinningMode 几种模式介绍
(Apple建议将证书内置到APP中安全性更好, APP更新频率比较高,一年发布多个版本,在证书即将到期时将续费后的新证书添加的APP中以免连接不上服务器)
AFSSLPinningModeNone | 信任服务器端返回的证书(有中间人证书攻击的风险) | APP更新频率3年以上或者 基本不更新 选择此模式, APP无需内置证书 |
AFSSLPinningModePublicKey | 客户端会将服务器端返回的证书与本地保存的证书中的PublicKey的部分进行校验,正确才能访问 | 建议购买2年以上证书 |
AFSSLPinningModeCertificate | 客户端会将服务器端返回的证书和本地保存的证书进行效验 (公钥、有效期),正确才能访问 | 建议购买2年以上证书 |
建议证书购买2~3年期,如果购买一年,证书到期APP将连接不上服务器。
一、 转换证书格式为 DER格式(二进制)
使用OpenSSL命令
openssl x509 -in yourdomain.crt -out yourdomain.cer -outform der
WINDOWS系统
双击crt证书,点击上面标签页【详细信息】,右下角【复制到文件】 , 选择DER二进制格式,保存即可。
注意, 请将域名证书和根证书(有多个—–BEGIN CERTIFICATE—– —–END CERTIFICATE—– 复制到独立的文件,转成CER编码)
二、证书添加到项目
三、编写代码
HttpClient.h
#import <UIKit/UIKit.h> #import "AFNetworking/AFHTTPSessionManager.h" @interface HttpClient : AFHTTPSessionManager + (HttpClient *)sharedInstance; @end
HttpClient.m
#import "HttpClient.h" @implementation HttpClient + (HttpClient *)sharedInstance { static HttpClient *_sharedClient = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSString *cerPath1 = [[NSBundle mainBundle] pathForResource:@"domain" ofType:@"cer"]; NSData *certData1 = [NSData dataWithContentsOfFile:cerPath1]; NSString *cerPath2 = [[NSBundle mainBundle] pathForResource:@"alphassl" ofType:@"cer"]; NSData *certData2 = [NSData dataWithContentsOfFile:cerPath2]; NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; _sharedClient = [[HttpClient alloc] initWithBaseURL:nil sessionConfiguration:sessionConfiguration]; AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; //AFSSLPinningModeCertificate //AFSSLPinningModePublicKey [policy setAllowInvalidCertificates:NO]; [policy setPinnedCertificates:[[NSArray alloc] initWithObjects:certData1,certData2, nil]]; _sharedClient.securityPolicy = policy; _sharedClient.responseSerializer = [AFHTTPResponseSerializer serializer]; }); return _sharedClient; } @end
**调用
- (IBAction) okButtonAction : (id) sender{ NSString *path = @"https://sslchecker.getssl.cn/"; [[HttpClient sharedInstance] GET:path parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { // Success NSLog(@"Success: %@", responseObject); }failure:^(NSURLSessionDataTask *task, NSError *error) { // Failure NSLog(@"Failure: %@", error); }]; }