近期很多客户咨询如何链接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);
}];
}
