• iOS9 Https技术预研


    一、服务器需要做的事情:

     

    1、要注意 App Transport Security 要求 TLS 1.2,

    2、而且它要求站点使用支持forward secrecy协议的密码。

    3、证书也要求是符合ATS规格的,ATS只信任知名CA颁发的证书,小公司所使用的 self signed certificate,还是会被ATS拦截。。因此慎重检查与你的应用交互的服务器是不是符合ATS的要求非常重要。

     

    二、客户端可使用四种方案:

     

    1、全部Https  2、俩者混合,个别不符合  3、 全部禁用Https   

    4、  默认禁用https, 但是对于特殊站点,开启Https

     

    1.

    HTTPS Only (只有HTTPS,所有情况下都使用ATS)

    如果你的应用只基于支持HTTPS的服务器,那么你太幸运了。你的应用不需要做任何改变。但是,注意App Transport Security要求TLS 1.2而且它要求站点使用支持forward secrecy协议的密码。证书也要求是符合ATS规格的。因此慎重检查与你的应用交互的服务器是不是符合ATS的要求非常重要。

    2.

    Mix & Match(混合)

    你的应用与一个不符合ATS要求的服务器工作是很有可能的。在这种情况下,你需要告诉操作系统哪些站点是涉及到的然后在你的应用的 Info.plist文件中指明哪些要求没有达到。

    3.

    Opt Out(禁用ATS)

    如果你在创建一个网页浏览器,那么你有一个更大的麻烦。因为你不可能知道你的用户将要访问那个网页,你不可能指明这些网页是否支持ATS要求且在HTTPS上传输。在这种情况下,除了全部撤销 App Transport Security 没有其它办法。

    4.

    Opt Out With Exceptions(除特殊情况外,都不使用ATS)

    当你的应用撤消了App Transport Security,,但同时定义了一些例外。这非常有用就是当你的应用从很多的服务器上取数据,但是也要与一个你可控的API交互。在这种情况下,在应用的Info.plist文件中指定任何加载都是被允许的,但是你也指定了一个或多个例外来表明哪些是必须要求 App Transport Security的。

     

     

     

     

    使用NSURLConnection支持HTTPS的实现

    // Now start the connection

    NSURL * httpsURL = [NSURL URLWithString:@"https://www.google.com"];

    self.connection = [NSURLConnection connectionWithRequest:[NSURLRequest requestWithURL:httpsURL] delegate:self];

    //回调

    - (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(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 = [NSURLCredential credentialForTrust:trust];

    [challenge.sender useCredential:cred forAuthenticationChallenge:challenge];

    } else {

    //5)验证失败,取消这次验证流程

    [challenge.sender cancelAuthenticationChallenge:challenge];

    }

     

    }

    使用AFNetworking来支持HTTPS

     

     

    AFNetworking是iOS/OSX开发最流行的第三方开源库之一,其作者是非常著名的iOS/OSX开发者Mattt Thompson,其博客NSHipster也是iOS/OSX开发者学习和开阔技术视野的好地方。AFNetworking已经将上面的逻辑代码封装好,甚至更完善,在AFSecurityPolicy文件中,有兴趣可以阅读这个模块的代码;

     

    AFNetworking上配置对HTTPS的支持非常简单:

     

    NSURL * url = [NSURL URLWithString:@"https://www.google.com"];

    AFHTTPRequestOperationManager * requestOperationManager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:url];

    dispatch_queue_t requestQueue = dispatch_create_serial_queue_for_name("kRequestCompletionQueue");

    requestOperationManager.completionQueue = requestQueue;

    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 = YES;

     

    //validatesCertificateChain 是否验证整个证书链,默认为YES

     

    //设置为YES,会将服务器返回的Trust Object上的证书链与本地导入的证书进行对比,这就意味着,假如你的证书链是这样的:

    //GeoTrust Global CA

    // Google Internet Authority G2

    // *.google.com

     

    //那么,除了导入*.google.com之外,还需要导入证书链上所有的CA证书(GeoTrust Global CA, Google Internet Authority G2);

     

    //如是自建证书的时候,可以设置为YES,增强安全性;假如是信任的CA所签发的证书,则建议关闭该验证,因为整个证书链一一比对是完全没有必要(请查看源代码);

    securityPolicy.validatesCertificateChain = NO;

     

    requestOperationManager.securityPolicy = securityPolicy;

     

     

    这就是AFNetworking的支持HTTPS的主要配置说明,AFHTTPSessionManager与之基本一致,就不重复了。

     

     

    客户端验证Https证书, 有服务器证书和客户端自建证书俩个证书来源, 到时候由服务器同学确定。

     

     

    相关知识参考:

    https://github.com/ChenYilong/iOS9AdaptationTips#1https-only-%E5%8F%AA%E6%9C%89https%E6%89%80%E6%9C%89%E6%83%85%E5%86%B5%E4%B8%8B%E9%83%BD%E4%BD%BF%E7%94%A8ats

     

     

    http://mp.weixin.qq.com/s?__biz=MzAxMzE2Mjc2Ng==&mid=211889548&idx=1&sn=8eb4da781c32a7fd51c3ad552347f322&scene=23&srcid=0922zkxfLe07GKN3NfLh8b6k#rd

  • 相关阅读:
    进程间通信
    图形的保存与重绘
    mysql记录1
    文件操作
    多线程及聊天室程序
    健康是成功之本
    文档与串行化
    HTML网页制作基础
    Hook和数据库访问
    C++基础笔记1
  • 原文地址:https://www.cnblogs.com/chen1987lei/p/4861049.html
Copyright © 2020-2023  润新知