iOS进行https请求时,比http请求多了一项ssl加密功能,在数据传输层对数据进行加密传输,保证数据的安全。
ssl加密需要证书验证;证书是ca机构颁发的话,不需要多余的代码,请求以前http的时候怎么写现在还怎么写,只是把请求url的http改成https;但是如果站点的证书是自签证书(如通过java keytool自生成),ios默认是验证不通过的,请求会失败,就需要在http请求做对应的处理。
比如使用AFNetworking进行网络请求,就需要将自签名证书配置进去,代码示例如下:
// /先导入证书
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"xxx" ofType:@"cer"];//证书的路径
NSData *certData = [NSData dataWithContentsOfFile:cerPath];
// AFSSLPinningModeCertificate 使用证书验证模式
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
// allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO
// 如果是需要验证自建证书,需要设置为YES
securityPolicy.allowInvalidCertificates = YES;
securityPolicy.validatesDomainName = NO;
securityPolicy.pinnedCertificates = @[certData];
代码层配置完成后,需配置app的info.plist;如图
需要配置app transport security settings;其中有三项配置,分别为:
Allows Arbitrary Loads 默认值为NO,表示禁止非https请求;也就是为NO时,只允许https请求;设置为YES时,允许任何请求;
Allows Arbitrary Loads In Web Content 默认值为NO;该属性表示web界面是否可以任意加载,为NO时只允许加载https请求,为YES时,允许加载任意请求;
Exception Domains 该属性作用是添加站点,对该站点进行设置;该站点是否必须是https请求,该站点的子节点是否需要https请求;可以设置如下属性:
NSIncludesSubdomains(包含所有的子站点),
NSExceptionAllowsInsecureHTTPLoads(允许加载http请求),
NSExceptionMinimumTLSVersion(需要TLS最低版本),
NSExceptionRequiresForwardSecrecy,
NSRequiresCertificateTransparency;
参考文章:
https://onevcat.com/2016/06/ios-10-ats/
http://www.cnblogs.com/symen/p/5566204.html