------非自签名证书配置------------#
要求环境:
服务器:
1.支持TLS1.2 ;
2.使用支持forward secrecy协议密码;
3.证书要求符合 ATS规定;
4.域名符合ATS要求;
iOS端: 配置AFSecurityPolicy即可;
关于服务器的要求解释:
TLS1.2 和 forward secrecy协议就不说了,自行百度; 加密算法要求最低 SHA2 或 RSA;```
####什么样的证书才是符合ATS要求的呢?
当然是经过知名CA认证的. 说简单点就是花钱买的,价格几百到几千不等(吐槽一下,我们4W/年) ```
什么样的域名才是符合要求的呢?
这个比较简单,终端一条命令搞定,像这样:nscurl --ats-diagnostics --verbose https://xxxxxx.com xxxxx.com 就是你的域名啦,执行完出现下面界面,全是 pass 就对了,如果出现failed ,看看是哪一项,找服务器扯皮吧.
关于iOS端的配置:
// YTKNetWork 的配置
-(void)configHttps{
// 获取证书
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"baidu" ofType:@"cer"];//证书的路径
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
// 配置安全模式
YTKNetworkConfig *config = [YTKNetworkConfig sharedConfig];
config.baseUrl = k_BASE_URL;
// config.cdnUrl = @"http://fen.bi";
// 验证公钥和证书的其他信息
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
// 允许自建证书
securityPolicy.allowInvalidCertificates = YES;
// 校验域名信息
securityPolicy.validatesDomainName = YES;
// 添加服务器证书,单向验证; 可采用双证书 双向验证;
securityPolicy.pinnedCertificates = [NSSet setWithObject:certData];
[config setSecurityPolicy:securityPolicy];
}
到此基本完成,来讲讲中间的坑:
1.error 1004 :cannot connect server ;
错误描述: iOS9 报错1004 ,而iOS8和10 都没问题;
解决办法: 明显是证书验证不过,问了服务器,说用的测试自建证书,换完之后出现 -1016
2.error 1006: content-Type ;text/html
错误描述:error 1006
解决办法: 用的YTKNetWork修改contentType比较费劲,AFN很容易,如下:
_manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",@"application/json",@"text/json",@"text/xml",nil];
使用 YTK 遇到同样问题的朋友,可以参考本人另一篇博文:黑科技 扩展 YTKNetWork 对text/html的支持
- 修改完error 3840 code 404,又出问题了,
错误描述:error code 3840, 英文翻译: 返回数据格式不是集合,无法解析;
解决办法: 尝试直接访问服务器开发人员主机,结果OK;访问 https://xxxx.com 报错3840,后来一番查找,发现域名没有备案,公司去备案域名;
改用测试服务器,换了ip 地址和端口号, 终于OK了;