zoukankan      html  css  js  c++  java
  • 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];



  • 相关阅读:
    Rotation Kinematics
    离职 mark
    PnP 问题方程怎么列?
    DSO windowed optimization 代码 (4)
    Adjoint of SE(3)
    IMU 预积分推导
    DSO windowed optimization 代码 (3)
    DSO windowed optimization 代码 (2)
    OKVIS 代码框架
    DSO windowed optimization 代码 (1)
  • 原文地址:https://www.cnblogs.com/soulDn/p/9663424.html
Copyright © 2011-2022 走看看