我们的服务遍布中国

我们的服务遍布中国
乃至世界

光网所服务的品牌地域与城市
北京 天津 上海 广州 深圳 香港 厦门 江苏 浙江 山东
重庆 长沙 武汉 成都 西安 宁夏 丽江 青海 云南 乌鲁木齐
黑龙江 内蒙古 河北 ...
光网服务与合作的全球各地
美国 加拿大 德国 法国 英国 瑞士 意大利 荷兰
印度 日本 韩国 ...

不论你的品牌在何处
我们都可以提供完善的服务与帮助

致电

0512-56969630
您所在的位置:首页 > SSL证书

iOS 9/10如何链接 HTTPS

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

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