简单三步:iOS配置HTTPS支持苹果ATS?
距离苹果iOS强制HTTPS只剩10天!10天后,苹果将关闭HTTP的大门。选择合适的SSL证书、在APP服务端部署SSL证书、在iOS客户端适配ATS,简单三步iOS APP配置HTTPS支持ATS。
第一步:选择合适的SSL证书
SSL证书按验证的类别可分:
DV SSL证书(域名验证型):只验证域名所有权,适合个人网站、博客等站点使用;
OV SSL证书(企业验证型):验证网站所属单位身份,适合企业级用户使用;
EV SSL证书(扩展验证型):扩展验证网站所属单位身份,这种证书在浏览器中会显示醒目的绿色地址栏,可信度最高,适合需要用户高度信任的企业级用户使用。
沃通新证书产品支持苹果iOS系统和safari浏览器,满足ATS安全设置要求。企业级开发者推荐使用超安SSL Pre和超真SSL Pre等企业级别以上的SSL证书,支持多域名或通配域名,满足业务扩展需求。
特别提示:采用自签名证书(无效证书)实现HTTPS连接,直接访问会报错且极有可能无法通过App store审核,开发者慎用!
第二步:1.在APP服务端部署SSL证书
从沃通证书文件压缩包中,打开其中的for Nginx 文件可以看到 2 个文件,包括公钥、私钥。
打开Nginx安装目录下conf目录中的nginx.conf文件找到
#HTTPS server
#
#server {
# listen 443;
# server_name localhost;
# ssl on;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_timeout 5m;
# ssl_protocols SSLv2 SSLv3 TLSv1;
# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
将其修改为 :
server {
listen 443;
server_name localhost;
ssl on;
ssl_certificate sslkey/public.cer; (证书公钥)
ssl_certificate_key sslkey/private.key; (证书私钥)
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1TLSv1.2;
ssl_ciphers ECDH:AESGCM:HIGH:!RC4:!DH:!MD5:!aNULL:!eNULL;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
保存退出,并重启Nginx。
通过https方式访问您的站点,确认站点证书安装配置正确。
第二步:2.云平台(SLB/CDN/WAF)配置HTTPS
打开证书配置面板(以阿里云为例)
SLB :负载均衡-->证书管理-->创建证书
CDN :CDN域名列表页-->选择域名进入管理页面-->基本信息-->域名信息-->HTTPS安全加速
WAF :云盾-->Web应用防火墙-->点击域名https协议后面的“未上传证书”
解压得到for nginx 看到2个文件(公钥和私钥),使用notepad++、UltraEdit、写字板(不要使用记事本)。将domain.com.crt文件打开,删除-----END CERTIFICATE-----后面的空行(一共三个)
-----END CERTIFICATE-----
(删除这个空行)
-----BEGIN CERTIFICATE-----
将crt文件中的三段内容黏贴到“证书内容”中,将domain.com.key文件黏贴到“私钥”。
证书region(证书区域)勾选和购买的服务器区域一致,点击确认,完成证书的创建。
第三步:iOS客户端适配ATS
1. 使用NSURLConnection支持HTTPS的实现
// Now start the connection
NSURL*httpsURL=[NSURL URLWithString:@"https://www.google.com"];
self.connection=[NSURLConnection connectionWithRequest:[NSURLRequestrequestWithURL:httpsURL] delegate:self];
//回调
-(void)connection:(NSURLConnection*)connectionwillSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge*)challenge{
//1)获取trust object
SecTrustRef trust=challenge.protectionSpace.serverTrust;
SecTrustResultType result;
//2)SecTrustEvaluate对trust进行验证
OSStatus status=SecTrustEvaluate(trust,&result);
if(status==errSecSuccess &&
(result==kSecTrustResultProceed ||
result==kSecTrustResultUnspecified)){
//3)验证成功,生成NSURLCredential凭证cred,告知challenge的sender使用这个凭证来继续连接
NSURLCredential*cred=[NSURL CredentialcredentialForTrust:trust];
[challenge.sender useCredential:cred forAuthenticationChallenge:challenge];
}else{
//5)验证失败,取消这次验证流程
[challenge.sender cancelAuthenticationChallenge:challenge];
}
}
2. 使用AFNetworking来支持HTTPS
AFNetworking定义了三种SSLpinningmode:
AFSSLPinningModeNone: 代表客户端无条件地信任服务器端返回的证书
AFSSLPinningModePublicKey : 代表客户端会将服务器端返回的证书与本地保存的证书PublicKey的部分进行校验;如果正确,才继续进行。
AFSSLPinningModeCertificate: 代表客户端会将服务器端返回的证书和本地保存的证书中的所有内容,包括PublicKey和证书部分,全部进行校验;如果正确,才继续进行。
(关于 pinning mode:简单的说就是你可以将SSL证书跟你的 APP 一起打包,藉由此机制来避免中间人伪造SSL证书的风险。)
以更加安全的AFSSLPinningModeCertificate验证模式为例。
// 1.获得请求管理者
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 2.加上这个函数,https ssl 验证。
[manager setSecurityPolicy:[self customSecurityPolicy]];
// https ssl 验证函数
- (AFSecurityPolicy *)customSecurityPolicy {
// 先导入证书
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"xxx" ofType:@"cer"];//证书的路径
NSData *cerData = [NSData dataWithContentsOfFile:cerPath];
// AFSSLPinningModeCertificate 使用证书验证模式
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
// allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO
//validatesDomainName 是否需要验证域名,默认为YES;
//validatesCertificateChain 是否验证整个证书链,默认为YES;
转载于:https://my.oschina.net/wossl/blog/810137