美文网首页程序员iOS Developer牛叉的demo
《小印记》iOS源码分享--HTTPS配置篇

《小印记》iOS源码分享--HTTPS配置篇

作者: _子墨 | 来源:发表于2017-03-22 16:43 被阅读197次

    笔者前不久终于发布了自己的APP《小印记》,在此分享一些iOS源码,如果读者学到了有用的东西,希望能前往App Store下载《小印记》支持一下笔者,谢谢!🙂

    《小印记》iOS源码分享--极光推送实践篇
    《小印记》iOS源码分享--自定义弹框篇
    《小印记》源码分享--极光推送服务器篇
    《小印记》iOS源码分享--网络层封装篇


    一、前言

    虽然今年1月1日苹果公司并没有强制要求所有APP使用HTTPS通信,但笔者相信这也是迟早的事情。为了通信数据的安全,笔者花了一点时间将通信由之前的HTTP改成了HTTPS,这里写下改造过程,希望对读者有帮助。


    二、简要说明

    HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

    它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https: URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。

    HTTPS和HTTP的主要区别

    1. https协议需要到ca申请证书,一般免费证书很少,需要交费。
    2. http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
    3. http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
    4. http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

    如果使用HTTP的话,通用做法是在 Info.plist 中声明,倒退回不安全的网络请求:

    12.png

    但现在既然要启用HTTPS,所以需要将这个设置删除


    三、SSL证书准备

    HTTPS改造的关键就是证书。笔者使用的是 COMODO 的证书(在某宝上买的),反正不贵,一年也就几十块钱,而且还省心。购买ssl证书时,证书需要绑定域名(不能绑定IP),所以笔者又到某云上购买了一个域名,然后将域名和服务器IP绑定起来,具体的购买和绑定方法网上搜搜有很多的。虽然网上有很多自签证书的做法,但是否能通过审核笔者不知,为了安全,笔者建议还是使用正规的SSL证书。iOS 9 中可用的受信任根证书列表


    四、iOS客户端代码配置

    笔者使用的AFNetworking(版本3.1.0),具体源码如下

    注意:一定要将 .cer 文件导入到工程中!!!

    + (AFHTTPSessionManager *)manager;
    {
        static AFHTTPSessionManager *shareInstance = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            
            NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
            shareInstance = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:BaseHttpURLString] sessionConfiguration:configuration];
            //设置请求参数的类型:JSON
            shareInstance.requestSerializer = [AFJSONRequestSerializer serializer];
            //设置服务器返回结果的类型:JSON (AFJSONResponseSerializer,AFHTTPResponseSerializer)
            shareInstance.responseSerializer = [AFJSONResponseSerializer serializer];
            //设置请求的超时时间
            shareInstance.requestSerializer.timeoutInterval = 20.0f;
            //设置ContentType
            shareInstance.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/html", @"text/json", @"text/plain", @"text/javascript", @"text/xml", @"image/jpeg",@"image/png", nil];
            
            // https配置
            NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"你的证书名" ofType:@"cer"];
            NSData *certData = [NSData dataWithContentsOfFile:cerPath];
            AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:[[NSSet alloc] initWithObjects:certData, nil]];
            NSSet *dataSet = [[NSSet alloc] initWithObjects:certData, nil];
            // setPinnedCertificates 设置证书文件(可能不止一个证书)
            [securityPolicy setPinnedCertificates:dataSet];
            // allowInvalidCertificates 是否允许无效证书
            [securityPolicy setAllowInvalidCertificates:NO];
            // validatesDomainName 是否需要验证域名
            [securityPolicy setValidatesDomainName:YES];
            
            shareInstance.securityPolicy = securityPolicy;
        });
        return shareInstance;
    }
    

    同时附上服务器端Tomcat(apache-tomcat-7.0.73/conf/server.xml)的配置:

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
                   maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
                   clientAuth="false" sslProtocol="TLSv1.2" keystoreFile="/home/jacedy/tomcat/apache-tomcat-7.0.73/你的证书名.jks" keystorePass="123456" />
    

    好了,到这里,HTTPS的改造也就完成了,使用Charles抓包的话,看到的数据将会是一堆乱码。


    最后附上《小印记》截图,希望读者多多支持! 🙂

    WechatIMG138.png

    相关文章

      网友评论

        本文标题:《小印记》iOS源码分享--HTTPS配置篇

        本文链接:https://www.haomeiwen.com/subject/kbgonttx.html