iOS 9/10如何链接 HTTPS

发布时间:2017/2/19 20:47:07 打印 字号:

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

 

######## 常见问题

1 .  AFSecurityPolicy setPinnedCertificates 需要添加服务器证书、中级证书

2.  Failure: Error Domain=NSURLErrorDomain Code=-999 “cancelled” UserInfo={NSErrorFailingURLKey=

证书链不受信任

3.  Failure: Error Domain=com.alamofire.error.serialization.response Code=-1016 “Request failed: unacceptable content-type: text/html”


manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];