ios https 安全证书配置

原定于2017年1月1日起所有提交到 App Store 的App必须强制开启 ATS,需要配置Https。但是现在不需要了,无固定期限的往后延期了,但是这个还是得弄明白下为好,说不定哪天突然就让弄了。
一、 2017年1月1日起所有提交到 App Store 的App必须强制开启 ATS。
就是要求去掉 Info.plist 的 NSAllowsArbitraryLoads
1.这要求所有通过APP发送的网络请求都需要https

2.开启ATS,图片(例如图像的URL)等静态文件的url需要用https,否则会无法加载;

3.对于H5,网页浏览和视频播放的行为,iOS 10 中新加入了NSAllowsArbitraryLoadsInWebContent 键。通过将它设置为 YES ,
可以让你的 app 中的 WKWebView 和使用 AVFoundation 播放的在线视频不受 ATS 的限制。
这也应该是绝大多数使用了相关特性的 app 的选择。但是坏消息是这个键在 iOS 9 中并不会起作用.

4.iOS9中可以选择使用 NSExceptionDomains 来针对特定的域名开放 HTTP 应该要相对容易过审核。“需要访问的域名是第三方服务器,他们没有进行 HTTPS 对应”会是审核时的一个可选理由,但是这应该只需要针对特定域名,而非全面开放。如果访问的是自己的服务器的话,可能这个理由会无法通过。是需要在Info.plist 配置中的XML源码

 <key>NSAppTransportSecurity</key>  
 <dict> <key>NSExceptionDomains</key> <dict> <key>XXX.com</key> <dict> <!--适用于这个特定域名下的所有子域--> <key>NSIncludesSubdomains</key> <true/> <!--扩展可接受的密码列表:这个域名可以使用不支持 forward secrecy 协议的密码--> <key>NSExceptionRequiresForwardSecrecy</key> <false/> <!--允许App进行不安全的HTTP请求--> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> <!--在这里声明所支持的 TLS 最低版本--> <key>NSExceptionMinimumTLSVersion</key> <string>TLSv1.1</string> </dict> </dict> </dict> 

二、 目前项目中用到的第三方已经支持https的有

WKWebView  
UIWebView  
SDWebImage  
 支付宝SDK  
 微信支付SDK  
 友盟SDK  
 极光推送SDK  
其中用到的UIWebView 以后要逐步替换为WKWebView 

上面内容参考于:http://blog.csdn.net/zhangmengleiblog/article/details/53536956

三、下面是在AFN中配置实例:
+ (AFSecurityPolicy*)customSecurityPolicy
{
// /先导入证书
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"hgcang" ofType:@"cer"];//证书的路径
NSData *certData = [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; securityPolicy.pinnedCertificates = @[certData]; return securityPolicy; } 

将上面的方法添加到我们AFN请求数据中
+ (void)post:(NSString *)url params:(NSDictionary *)params success:(void (^)(id))success failure:(void (^)(NSError *))failure
{
// 1.获得请求管理者
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
// 2.申明返回的结果是text/html类型
mgr.responseSerializer = [AFHTTPResponseSerializer serializer];

// 加上这行代码,https ssl 验证。
//[mgr setSecurityPolicy:[self customSecurityPolicy]];

// 3.发送POST请求
[mgr POST:url parameters:params
  success:^(AFHTTPRequestOperation *operation, id responseObj) {
      if (success) { success(responseObj); } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { if (failure) { failure(error); } }]; } 

上面参考于 http://blog.csdn.net/canlanyangg/article/details/53559597 这篇文章。
四.关于证书 参考文章:http://www.2cto.com/Article/201510/444706.html
服务端给的是crt后缀的证书,其中iOS客户端用到的cer证书,是需要开发人员转换:
1.证书转换
在服务器人员,给你发送的crt证书后,进到证书路径,执行下面语句

openssl x509 -in 你的证书.crt -out 你的证书.cer -outform der

这样你就可以得到cer类型的证书了。双击,导入电脑。
2.证书放入工程
1、可以直接把转换好的cer文件拖动到工程中。
2、可以在钥匙串内,找到你导入的证书,单击右键,导出项目,就可以导出.cer文件的证书了

参考链接:http://www.jianshu.com/p/97745be81d64

五.在info.plist去掉之前允许http加载的代码 就是删除下面的代码(么有的就省了这一步)

<key>NSAppTransportSecurity</key>  
<dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> 

六、可能出现的问题:
6.1服务器可能出现的问题:

Error Domain=NSURLErrorDomain Code=-1200 "发生了 SSL 错误,无法建立与该服务器的安全连接。" UserInfo=    {NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef:     0x15dd87140>, NSLocalizedRecoverySuggestion=您仍要连接此服务器吗?, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, NSErrorPeerCertificateChainKey=<CFArray 0x15df6b640 [0x1a08d5150]>{type = immutable, count = 1, values = ( 0 : <cert(0x15f3559e0) s: dbh i: dbh> )}, NSUnderlyingError=0x15dd5f770 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=<SecTrustRef: 0x15dd87140>, _kCFNetworkCFStreamSSLErrorOriginalValue=-9802, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, kCFStreamPropertySSLPeerCertificates=<CFArray 0x15df6b640 [0x1a08d5150]>{type = immutable, count = 1, values = ( 0 : <cert(0x15f3559e0) s: dbh i: dbh> )}}}, NSLocalizedDescription=发生了 SSL 错误,无法建立与该服务器的安全连接。, NSErrorFailingURLKey=https://192.168.1.138/app/login/login.json, NSErrorFailingURLStringKey=https://192.168.1.138/app/login/login.json, NSErrorClientCertificateStateKey=0} 

可能是服务器配置的证书不对,苹果要求是TLS1.2,服务端配置是TLS1.0。
也有可能是后台签名算法问题 https://my.oschina.net/vimfung/blog/494687
6.2、证书一定要拉到项目里面,AFN加了验证之后,看看获取证书的certData是否为空。如果为空,则证书有问题
NSData *certData = [NSData dataWithContentsOfFile:cerPath];



转载于:https://www.cnblogs.com/soulDn/p/9663424.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于JMeter录制iOS脚本时的证书配置,你需要完成以下步骤: 1. 在你的iOS设备上安装并信任所使用的SSL证书。你可以通过以下方式完成: - 将证书文件发送到你的iOS设备上,然后在设备上打开证书文件进行安装。 - 通过邮件或其他方式将证书文件发送给自己,在设备上打开邮件并安装证书。 2. 在JMeter中配置代理服务器以便录制HTTPS请求。在JMeter中,选择"Options" > "SSL Manager"。然后点击"Clear"按钮清除已有的证书,再点击"Start"按钮生成新的证书。 3. 在iOS设备上配置代理服务器。在iOS设备中,进入"设置" > "无线局域网" > "选择当前连接的WiFi网络" > "HTTP代理"。选择"手动"并输入你计算机的IP地址和JMeter设置的代理端口号。 4. 在JMeter中,通过选择"Options" > "Proxy Server"来配置代理服务器。输入代理服务器的端口号,并确保"Capture HTTP Headers" 和 "Capture HTTPS Headers" 选项被选中。 5. 启动JMeter的代理服务器。在JMeter中,选择 "Options" > "Start" 或者点击工具栏上的 "Start" 按钮。 6. 在iOS设备上使用你想要测试的应用程序,并确保所有的网络请求都经过了JMeter代理服务器。 7. 在JMeter中,选择"Recording Controller",然后点击工具栏上的 "Start" 按钮开始录制。 这样,JMeter就会开始录制你的iOS应用程序的网络请求,并将其保存为JMX脚本文件。请注意,录制期间可能会出现证书安全提示,请按照提示进行操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值