iOS 9/10如何链接 HTTPS


近期很多客户咨询如何链接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);
 }];
 }
免备案空间专题