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

原创
2017/03/22 16:40
阅读数 567

笔者前不久终于发布了自己的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抓包的话,看到的数据将会是一堆乱码。


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

展开阅读全文
打赏
1
12 收藏
分享
加载中
更多评论
打赏
0 评论
12 收藏
1
分享
返回顶部
顶部