笔者前不久终于发布了自己的APP《小印记》,在此分享一些iOS源码,如果读者学到了有用的东西,希望能前往App Store下载《小印记》支持一下笔者,谢谢!
一、前言
虽然今年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的主要区别
-
https协议需要到ca申请证书,一般免费证书很少,需要交费。
-
http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
-
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
-
http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
如果使用HTTP的话,通用做法是在 Info.plist 中声明,倒退回不安全的网络请求:
但现在既然要启用HTTPS,所以需要将这个设置删除!
三、SSL证书准备
HTTPS改造的关键就是证书。笔者使用的是 COMODO 的证书(在某宝上买的),反正不贵,一年也就几十块钱,而且还省心。购买ssl证书时,证书需要绑定域名(不能绑定IP),所以笔者又到某云上购买了一个域名,然后将域名和服务器IP绑定起来,具体的购买和绑定方法网上搜搜有很多的。虽然网上有很多自签证书的做法,但是否能通过审核笔者不知,为了安全,笔者建议还是使用正规的SSL证书。
四、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)的配置:
好了,到这里,HTTPS的改造也就完成了,使用Charles抓包的话,看到的数据将会是一堆乱码。
最后附上《小印记》截图,希望读者多多支持!