iOS 用免费证书来适配HTTPS
2017-04-20 本文已影响116人
Mortimey_yt
-
iOS单向验证
//先导入证书,找到证书的路径 NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"证书名" ofType:@"cer"]; NSData *cerData = [NSData dataWithContentsOfFile:cerPath]; //AFSSLPinningModeCertificate 使用证书验证模式 AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; //allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO //如果是需要验证自建证书,需要设置为YES securityPolicy.allowInvalidCertificates = YES; //validatesDomainName 是否需要验证域名,默认为YES; //假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。 //置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。 //如置为NO,建议自己添加对应域名的校验逻辑。 securityPolicy.validatesDomainName = NO; NSSet *set = [[NSSet alloc] initWithObjects:cerData, nil]; securityPolicy.pinnedCertificates = set; //在AFN设置上securityPolicy AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; manager.securityPolicy = securityPolicy;
-
双向认证:请参考链接:http://www.jianshu.com/p/9e573607be13
-
常见错误:
MM_yt_1.png
错误码: "failure = Error Domain=NSURLErrorDomain Code=-999",断点跟踪发现,
MM_yt_2.png
// 这是因为证书的问题,证书多加密了一层BASE64加密 -
解决办法:右键用文本编辑软件打开就能看到
MM_yt_3.png
MM_yt_4.png
第一种方法:把证书里面的字符串复制出来,然后解BASE64后再转Data。
NSData *cerData = [[NSData alloc] initWithBase64EncodedString:httpsKEY options:0];
注意:要把如下内容去掉只保留中间的字符串
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
第二种方法:用mac系统的字符串工具把证书导入进来,然后再导出成cer,这个cer就可以直接使用.
// 双击cer文件,在钥匙串中找到该证书
// 然后直接导出即可