10 https ios

2016-11-23 10:59:39 u011313218 阅读数 687

ios和android完美配置https

目录:

  • https介绍
  • https性能
  • https配置流程
  • ios和android配置上的区别(服务器端)
  • 双向验证和单向验证

1.https介绍

HTTPS全称:Hyper Text Transfer Protocol over Secure Socket Layer,顾名思义就是http加入ssl层构建的可进行加密传输、身份认证的网络协议

2.https性能

HTTPS能够有效地保护用户隐私,防止内容劫持,是一个非常安全的协议。但是目前依然有70%以上的网站没有部署HTTPS。主要还是存在如下两个严重的性能问题:

(1).HTTPS严重影响用户的访问速度。在未经任何优化的情况下,HTTPS相比HTTP要慢200ms以上,移动端甚至要慢500ms以上;

(2).HTTPS会极大增加服务端的计算成本。HTTPS的完全握手导致服务器处理性能不到HTTP的10%;

3.https配置流程

这边以keytool工具来自己生成证书为例,如果在真实环境可自行去购买或者申请免费ca证书
(1)生成服务器证书库

keytool -genkey -v -alias tomcat -keyalg RSA -keystore D:\key\tomcat.keystore -validity 36500

(参数说明:“D:\key\tomcat.keystore”含义是将证书文件的保存路径,证书文件名称是tomcat.keystore;“-validity 36500”含义是证书有效期,36500表示100年,默认值是90天;“tomcat”为自定义证书名称)

(2)生成浏览器证书

keytool -genkey -v -alias browser -keyalg RSA -storetype PKCS12 -keystore D:\key\browser.p12

4.ios和android配置上的区别

*本段不涉及app客户端相关的配置
主要区别在于2者需要的证书不同

………………….未完待续……………………………..

2017-08-28 00:03:58 fjh658 阅读数 4200

charles的 >= iOS10.3 https代理

  • 当OS系统升级>= iOS10.3(之前的手机升级一直报错, 升不到10.3, 没发现这个问题, 这次升级到iOS11才发现了, 误以为是iOS11才改的)时, 你会发现charles抓不到数据了.

    如图所示
    Notes You may need to configure your browser or application to trust the Charles Root Certificate. See SSL Proxying in the Help menu.

  • 明明iOS已经通过 http://chls.pro/ssl 安装了charles根证书, 为何还是不能代理?

  • 这是因为iOS 10.3 进一步增加了三方证书校验级别. CA授权的ssl证书是有证书链的, 这个会直接信任.
  • charles代理使用的是自签名的root证书, 需要手动设置.
    步骤如下:
    • 关于本机->证书信任设置
      这里写图片描述
    • charles root证书信任
      这里写图片描述
2018-07-05 16:37:01 plpldog 阅读数 858

iOS9推出的时候,苹果希望大家使用https协议,来提高数据传输之间的安全性。下面我就从最简单的代码介绍,如何在工程中设置,来支持https的请求。

一、证书准备篇

  • 1.证书转换
    在服务器人员,给你发送的crt证书后,进到证书路径,执行下面语句
    // openssl x509 -in 你的证书.crt -out 你的证书.cer -outform der
    这样你就可以得到cer类型的证书了。双击,导入电脑。
  • 2.证书放入工程
    1、可以直接把转换好的cer文件拖动到工程中。
    2、可以在钥匙串内,找到你导入的证书,单击右键,导出项目,就可以导出.cer文件的证书了

二、代码修改篇

先在info.plist中,增加如下图的配置


QQ20160909-7@2x.png-25.6kB
QQ20160909-7@2x.png-25.6kB

文本内容如下:

  1. <key>NSAppTransportSecurity</key>
  2. <dict>
  3. <key>NSAllowsArbitraryLoads</key>
  4. <true/>
  5. </dict>

1.使用系统类发送网络请求篇

1.1 NSURLConnection设置支持https。

在2015年iOS9的更新中,NSURLConnection 被废弃 由 NSURLSession 取代,所以本身是不建议大家继续用这个类做网络请求的(同样也有AFNetWorking 2.x版本),但是考虑到一些旧程序,也不能说改就改,说替换就替换的,所以还是需要普及一下,如果用到了NSURLConnection你需要怎么做。

代码如下:

  1. - (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge{
  2. if(challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) {
  3. // 告诉服务器,客户端信任证书
  4. // 创建凭据对象
  5. NSURLCredential *credntial = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
  6. // 告诉服务器信任证书
  7. [challenge.sender useCredential:credntial forAuthenticationChallenge:challenge];
  8. }
  9. }

你只需要简单的,添加上如上的代理方法,就可以在不影响你原有请求的基础上,增加了https请求的支持了。

1.2 NSURLSession设置支持https。

现在推荐使用的就是NSURLSession来处理相关的网络请求了,如果使用系统自带的类,可以参考如下代码:

  1. - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * __nullable credential))completionHandler {
  2. // 判断是否是信任服务器证书
  3. if(challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) {
  4. // 告诉服务器,客户端信任证书
  5. // 创建凭据对象
  6. NSURLCredential *credntial = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
  7. // 通过completionHandler告诉服务器信任证书
  8. completionHandler(NSURLSessionAuthChallengeUseCredential,credntial);
  9. }
  10. NSLog(@"protectionSpace = %@",challenge.protectionSpace);
  11. }

2.使用AFNetWorking发送网络请求篇

AFNetworking是一个讨人喜欢的网络库,适用于iOS以及Mac OS X. 它构建于在NSURLConnection, NSOperation, 以及其他熟悉的Foundation技术之上. 它拥有良好的架构,丰富的api,以及模块化构建方式,使得使用起来非常轻松.。

2.1 AFNetWorking 2.x版本

考虑到这个版本,我们还可以使用AFHTTPRequestOperationManager这个类来处理网络请求。所以我们要做的就是给这个类,设置一些参数,让它可以支持https的请求,代码如下:

支持https(校验证书,不可以抓包):

  1. // 1.初始化单例类
  2. AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
  3. mgr.securityPolicy.SSLPinningMode = AFSSLPinningModeCertificate;
  4. // 2.设置证书模式
  5. NSString * cerPath = [[NSBundle mainBundle] pathForResource:@"xxx" ofType:@"cer"];
  6. NSData * cerData = [NSData dataWithContentsOfFile:cerPath];
  7. mgr.securityPolicy.pinnedCertificates = [[NSArray alloc] initWithObjects:cerData, nil];
  8. // 客户端是否信任非法证书
  9. mgr.securityPolicy.allowInvalidCertificates = YES;
  10. // 是否在证书域字段中验证域名
  11. [mgr.securityPolicy setValidatesDomainName:NO];

支持https(不校验证书,可以抓包查看):

  1. // 1.初始化单例类
  2. AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
  3. mgr.securityPolicy.SSLPinningMode = AFSSLPinningModeCertificate;
  4. // 2.设置非校验证书模式
  5. mgr.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
  6. mgr.securityPolicy.allowInvalidCertificates = YES;
  7. [mgr.securityPolicy setValidatesDomainName:NO];

2.2 AFNetWorking 3.x版本

在Xcode7.0之后,苹果废弃了NSURLConnection方法,数据请求使用NSURLSession,作为网络请求类第三方库使用量最大的AFN也及时的更新的新的版本——AFN 3.0版本。新的版本的里废弃了基于NSURLConnection封装的AFHTTPRequestOperationManager,转而使用基于NSURLSession封装的AFHTTPSessionManager了。

支持https(校验证书,不可以抓包):

  1. // 1.初始化单例类
  2. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  3. // 注意写法的变化
  4. manager.securityPolicy= [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
  5. // 2.设置证书模式
  6. NSString * cerPath = [[NSBundle mainBundle] pathForResource:@"xxx" ofType:@"cer"];
  7. NSData * cerData = [NSData dataWithContentsOfFile:cerPath];
  8. manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:[[NSSet alloc] initWithObjects:cerData, nil]];
  9. // 客户端是否信任非法证书
  10. manager.securityPolicy.allowInvalidCertificates = YES;
  11. // 是否在证书域字段中验证域名
  12. [manager.securityPolicy setValidatesDomainName:NO];

支持https(不校验证书,可以抓包查看):

  1. // 1.初始化单例类
  2. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  3. // 2.设置非校验证书模式
  4. manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
  5. manager.securityPolicy.allowInvalidCertificates = YES;
  6. [manager.securityPolicy setValidatesDomainName:NO];

三、使用Charles抓包https

3.1 软件下载篇

  • 1 工欲善其事必先利其器,需要工具的同学可以在这里下载,密码: gknp!
    下载到V3.9.3版本的Charles软件下载软件后,打开软件,然后command + q退出。
    之后将破解文件,放到下面路径
    应用程序->Charles->显示包内容->Contents->Resources里面,替换即可。

3.2 程序配置篇

1.进入Charles的配置界面


QQ20160909-0@2x.png-79.2kB
QQ20160909-0@2x.png-79.2kB

2.按图上操作


QQ20160909-1@2x.png-48.6kB
QQ20160909-1@2x.png-48.6kB

QQ20160909-2@2x.png-187.9kB
QQ20160909-2@2x.png-187.9kB

这样设置之后理论上就可以抓所有网址443端口的https请求了。但是还没完。我们还需要安装一个证书。如下图:


QQ20160909-3@2x.png-224.2kB
QQ20160909-3@2x.png-224.2kB

3.进入钥匙串,找到这个证书


QQ20160909-4@2x.png-349.8kB
QQ20160909-4@2x.png-349.8kB

单击右键,显示简介。如下图设置为始终信任


QQ20160909-5@2x.png-92.1kB
QQ20160909-5@2x.png-92.1kB

以上电脑端的准备就差不多了。

我们还需要在iPhone手机上,下载一下描述文件。
具体操作,大家就要点开这个网址,手机下载。网址
注意:手机点开这个网址
如下图操作

QQ20160909-6@2x.png-341.8kB
QQ20160909-6@2x.png-341.8kB

经过上面些步骤,我们已经把相应的软件以及证书都布置好了。之后,只需要在手机连接wifi后,设置手机代理。服务器填写电脑ip地址,端口号为8888.


20160909.jpg-100.7kB
20160909.jpg-100.7kB

现在你就可以感受用Charles抓https的请求啦。注意代码要写上面的可以抓包的代码,也就是无证书校验的。如果是有证书校验的,大家就不要妄想抓数据啦。

希望大家看完可以关注我!谢谢啦

如果您看了我的文章,觉得对您帮助很大,就请您支持我,我会写出更多的文章来回报您。

赞赏支持


登录 后发表评论
心语风尚
33楼 · 2017.08.30 16:16

支持https(不校验证书,可以抓包查看)这个里面没有用到前面的cer证书 是不是就可以不制作cer证书了

沃小沃
32楼 · 2017.08.21 11:54

请问单向证书和双向证书有啥区别 , 还有自签名的 和ca认证的

Exia_L
31楼 · 2017.07.28 16:50

感谢分享,很有帮助

Cherish183
30楼 · 2017.06.20 13:52

支持https,然后你又关闭 ATS ? 这样不是会误导读者么?

所以到底 要不要开呢

2017.06.22 17:53 回复

肯定NO 啊

2017.06.26 11:45 回复
爱音乐的小峰
29楼 · 2017.03.22 16:39

哦,查了一下,明白了一点,购买的证书对于ios开发来说,啥代码都不用写了
如果是自签名证书,就需要 验证证书的过程,也就是在 afn 里面写一些配置

爱音乐的小峰
28楼 · 2017.03.22 15:22

大神,不是太明白,如果服务器是HTTPS 访问,app 里面代码 是不是 afn 那里啥都不用写就行, 工程 创建的时候不是 默认就是 HTTPS 吗?

爱音乐的小峰
27楼 · 2017.03.22 15:19

AFN3.0 校验证书的时候,log 了 cerData 是有值的,崩溃的全局断点在 一个 AFSecurityPolicy 类里面 ,说是一个 可变数组 add Object 的 时候 有了 nil 对象,什么情况啊?

_舷_
26楼 · 2017.02.09 17:51

支持https(校验证书,不可以抓包)这篇里,mgr变量是否就是前面的manager的误写?

@_舷_ 啊,还真是,这就改了,抱歉。

2017.02.10 09:44 回复
Someone_Joker
25楼 · 2017.01.04 12:34

NSAllowsArbitraryLoads 这个必须设置成Yes吗?但是这个不是关闭ATS吗,设置成yes审核能过吗,大神 求解

iOS10适配问题

阅读数 9053

iOS 10 消息推送

阅读数 1060