一)
起因:由于苹果规定2017年1月1日以后,所有APP都要使用HTTPS进行网络请求。
之前,可以在Info.plist中禁用ATS功能,按如下设置即可。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
1月1日后,也许这样设置没有用了。
二)。
将项目中的 NSAllowsArbitraryLoads 设为No。之后发现项目跑不通,报错“发生了SSL错误”
用命令发现,公司的部分URL不满足ATS要求。
/usr/bin/nscurl --ats-diagnostics [--verbose] URL
ATS检测网站:https://www.qcloud.com/product/ssl
苹果强制升级的HTTPS需要满足iOS9中新增App Transport Security(简称ATS)特性:
1.必须是苹果信任的CA证书机构颁发的证书
2.后台传输协议必须满足: TLS1.2
3.签字算法只能是下面的一种:
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
4.证书必须使用SHA256或者更好的哈希算法进行签名,要么是2048位或者更长的RSA密钥,要么就是256位或更长的ECC密钥。
三)
其中一个服务器,通过添加TLS1.2 ,之后跑通了ATS,但是APP仍然报错。
最后发现,是因为虽然跑通了ATS,但是证书不受苹果信任,需要将证书导入项目中。
导出证书方法如下:
openssl s_client -connect www.google.com: </dev/null >/dev/null | openssl x509 -outform DER > https.cer"
并且在代码中使用我们的cer
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"XXXXX" ofType:@"cer"];
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
[securityPolicy setAllowInvalidCertificates:NO];
[securityPolicy setPinnedCertificates:@[certData]];
[securityPolicy setValidatesDomainName:YES]; manger.securityPolicy = securityPolicy;
参考网址:
https://www.qcloud.com/product/ssl
苹果ATS(强制HTTPS)审核新政解码
关于 iOS 10 中 ATS 的问题
正确使用AFNetworking的SSL保证网络安全
关于iOS9中的App Transport Security相关说明及适配(更新于2016.7.1)