前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >1、iOS安全【 SSL证书验证, 让Charles再也无法抓你的请求数据】2、iOS逆向:【绕过证书校验】

1、iOS安全【 SSL证书验证, 让Charles再也无法抓你的请求数据】2、iOS逆向:【绕过证书校验】

作者头像
公众号iOS逆向
发布2021-03-08 11:07:18
4.8K0
发布2021-03-08 11:07:18
举报
文章被收录于专栏:iOS逆向与安全iOS逆向与安全

前言

  • 原文

https://kunnan.blog.csdn.net/article/details/77115940

  • 效果:

经过app的SSL证书验证之后,就是这样子,别人无法获取报文,除非服务器的证书信任Charles的证书

验证方法:

  • AFNetworking的验证策略iOS安全【 SSL证书验证, 让Charles再也无法抓你的请求数据】
  • 针对NSURLConnection 的处理

(void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;

  • 针对NSURLSession

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge

completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler; 获取证书信息进行验证

I 、 app侧进行 SSL证书验证

1.0 HTTPS连接建立过程

AFSecurityPolicy用于验证HTTPS请求的证书 ,先来看看HTTPS的原理和证书相关的几个问题。

  • HTTPS连接建立过程:

客户端和服务端建立一个连接,服务端返回一个证书,客户端里存有各个受信任的证书机构根证书,用这些根证书对服务端返回的证书进行验证,经验证如果证书是可信任的,就生成一个pre-master secret,用这个证书的公钥加密后发送给服务端,服务端用私钥解密后得到pre-master secret,再根据某种算法生成master secret,客户端也同样根据这种算法从pre-master secret生成master secret,随后双方的通信都用这个master secret对传输数据进行加密解密。

  • 证书是怎样验证的?怎样保证中间人不能伪造证书?

首先要知道非对称加密算法的特点,非对称加密有一对公钥私钥,用公钥加密的数据只能通过对应的私钥解密,用私钥加密的数据只能通过对应的公钥解密。例子:一个证书颁发机构(CA),颁发了一个证书A,服务器用这个证书建立https连接。客户端在信任列表里有这个CA机构的根证书。首先CA机构颁发的证书A里包含有证书内容F,以及证书加密内容F1,加密内容F1就是用这个证书机构的私钥对内容F加密的结果。(这中间还有一次hash算法) 建立https连接时,服务端返回证书A给客户端,客户端的系统里的CA机构根证书有这个CA机构的公钥,用这个公钥对证书A的加密内容F1解密得到F2,跟证书A里内容F对比,若相等就通过验证。

整个流程大致是:F->CA私钥加密->F1->客户端CA公钥解密->F。因为中间人不会有CA机构的私钥,客户端无法通过CA公钥解密,所以伪造的证书肯定无法通过验证。

  • 什么是SSL Pinning?

可以理解为证书绑定,是指客户端直接保存服务端的证书,建立https连接时直接对比服务端返回的和客户端保存的两个证书是否一样,一样就表明证书是真的,不再去系统的信任证书机构里寻找验证。这适用于非浏览器应用,因为浏览器跟很多未知服务端打交道,无法把每个服务端的证书都保存到本地,但CS架构的像手机APP事先已经知道要进行通信的服务端,可以直接在客户端保存这个服务端的证书用于校验。

为什么直接对比就能保证证书没问题?如果中间人从客户端取出证书,再伪装成服务端跟其他客户端通信,它发送给客户端的这个证书不就能通过验证吗?确实可以通过验证,但后续的流程走不下去,因为下一步客户端会用证书里的公钥加密,中间人没有这个证书的私钥就解不出内容,也就截获不到数据,这个证书的私钥只有真正的服务端有,中间人伪造证书主要伪造的是公钥。为什么要用SSL Pinning?正常的验证方式不够吗?如果服务端的证书是从受信任的的CA机构颁发的,验证是没问题的,但CA机构颁发证书比较昂贵,小企业或个人用户可能会选择自己颁发证书,这样就无法通过系统受信任的CA机构列表验证这个证书的真伪了,所以需要SSL Pinning这样的方式去验证。当然更重要的是可以防止通过手动设置信任证书进行代理抓包,比如Charles

1.1 关于 DER 的概念:

  • Wikipedia
  • 如何查看证书的16进制DER编码,及证书的各个域DER格式

1.2 AFSecurityPolicy

NSURLConnection已经封装了https连接的建立、数据的加密解密功能,我们直接使用NSURLConnection是可以访问https网站的,但NSURLConnection并没有验证证书是否合法,无法避免中间人攻击。要做到真正安全通讯,需要我们手动去验证服务端返回的证书,AFSecurityPolicy封装了证书验证的过程,让用户可以轻易使用,除了去系统信任CA机构列表验证,还支持SSL Pinning方式的验证。

1.2.1 使用方法

  • 把服务端证书(需要转换成cer格式)放到APP项目资源里,AFSecurityPolicy会自动寻找根目录下所有cer文件
代码语言:javascript
复制
//把服务端证书(需要转换成cer格式)放到APP项目资源里,AFSecurityPolicy会自动寻找根目录下所有cer文件
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey];
securityPolicy.allowInvalidCertificates = YES;
[AFHTTPRequestOperationManager manager].securityPolicy = securityPolicy;
[manager GET:@"https://example.com/" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
}];

  • 1、目前采用的是AFSSLPinningModePublicKey 方式验证。
  • 2、 若想采用AFSSLPinningModeCertificate方式验证,需要服务端提供正确的cer 证书。

使用AFSSLPinningModeCertificate 方式验证的时候,获取 DER 表示的数据时 发生如下错误:Create a certificate Return NULL 。根据“@result Return NULL if the passed-in data is not a valid DER-encoded ”,从而推测cer证书 is not a valid DER-encoded。

1.2.2 使用 AFSecurityPolicy 时,总共有三种验证服务器是否被信任的方式:

代码语言:javascript
复制
AFSSLPinningModeNone
  • 这个模式不做本地证书验证(不做 SSL Pinning 操作)
  • 直接从客户端系统中的受信任颁发机构 CA 列表中去验证
代码语言:javascript
复制
AFSSLPinningModePublicKey
  • 客户端需要一份证书文件的拷贝
  • 验证时只验证证书里的公钥,不验证证书的有效期等信息
  • 即使伪造证书的公钥,也不能解密传输的数据,必须要私钥
代码语言:javascript
复制
AFSSLPinningModeCertificate
  • 客户端需要一份证书文件的拷贝
  • 第一步验证、先验证证书的域名/有效期等信息
  • 第二步验证、对比服务端返回的证书跟客户端存储的证书是否一致

1.3 AFNetworkingssl证书认证的步骤

1.3.1 获取到站点的证书:

  • 使用以下openssl命令来获取到服务器的公开二进制证书(以google为例):
代码语言:javascript
复制
"openssl s_client -connect www.google.com:443 </dev/null 2>/dev/null | openssl x509 -outform DER > https.cer"

1.3.2 web端服务器必须要提供一个叫SSL的证书

证书里面包含有一个叫.crt的文件,你需要将它转换成.cer的格式,转换方法如下:openssl x509 -in your certificate.crt -out your certificate.cer -outform der

  • 转换成功后需要找到你转换成.cer的文件.添加到你的xcode工程当中去;然后读取二进制数据对其赋值
  • 项目中的文件,攻击者很容易通过解包取出,所以我们一般,在代码中存放证书的二进制流数据

1.3.3 AFN2.x 需要添加AFSecuriPolicy和setAFHTTPRequestOperationManager


  • 设置安全策略setSecurityPolicy
代码语言:javascript
复制
   dispatch_once(&onceToken, ^{
        _manager = [AFHTTPRequestOperationManager manager];//只初始化一次
//        [_manager setSecurityPolicy:[HTTPRequestManager setupSecurityPolicy]];
        
    });

    btn.enabled = NO;
    
    //1. 设置安全策略
    [_manager setSecurityPolicy:[HTTPRequestManager setupSecurityPolicy]];
  • ssl证书检测设置:添加安全策略
代码语言:javascript
复制
#pragma mark - ******** ssl证书检测设置

+ (AFSecurityPolicy*)setupSecurityPolicy
{
    NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"cxxxxweimpliuay"ofType:@"cer"];
    NSData *certData = [NSData dataWithContentsOfFile:cerPath];
//    AFSecurityPolicy *securityPolicy = [[AFSecurityPolicy alloc] init];
    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
    [securityPolicy setPinnedCertificates:@[certData]];
    securityPolicy.allowInvalidCertificates =NO;//定义了客户端是否信任非法证书
    securityPolicy.validatesDomainName =YES;//是指是否校验在证书中的domain这一个字段
    securityPolicy.validatesCertificateChain =NO;//指的是是否校验其证书链。
    return securityPolicy;
}

1.3.4 ssl证书安全策略的的属性分析

代码语言:javascript
复制
securityPolicy.allowInvalidCertificates =NO;
securityPolicy.validatesDomainName =YES;
securityPolicy.validatesCertificateChain =NO;

1.3.4.0 pinnedCertificates
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-03-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 iOS逆向 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • I 、 app侧进行 SSL证书验证
    • 1.0 HTTPS连接建立过程
      • 1.1 关于 DER 的概念:
        • 1.2 AFSecurityPolicy
          • 1.2.1 使用方法
          • 1.2.2 使用 AFSecurityPolicy 时,总共有三种验证服务器是否被信任的方式:
        • 1.3 AFNetworkingssl证书认证的步骤
          • 1.3.1 获取到站点的证书:
          • 1.3.2 web端服务器必须要提供一个叫SSL的证书
          • 1.3.3 AFN2.x 需要添加AFSecuriPolicy和setAFHTTPRequestOperationManager
          • 1.3.4 ssl证书安全策略的的属性分析
      相关产品与服务
      SSL 证书
      腾讯云 SSL 证书(SSL Certificates)为您提供 SSL 证书的申请、管理、部署等服务,为您提供一站式 HTTPS 解决方案。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档