参考

一、中间人攻击

  概念:攻击者插入到原本直接通信的双方,让双方以为还在直接跟对方通讯,但是实际上双方的通信对方已经变成中间人,信息已经被中间人获取或篡改。

  HTTPS 的攻击分为两类:SSL 连接建立前的攻击;HTTPS 传输过程的攻击。

  • 0x00: SSL 证书欺骗攻击:将客户端段的访问重定向到攻击的机器(使用伪造证书),而攻击者机器在跟服务器连接。
    • 攻击工具:SSLSniff (伪造证书实现钓鱼攻击)
    • 防范措施:

      1)app 直接调用系统 API 创建的 HTTPS 连接一般不会受影响。只使用默认的系统校验,只要系统之前没有信任相关的伪造证书,校验就直接失败,不会 SSL握手成功;

      2)使用 webView 浏览网页,需要在 UIWebView 中加入较强的授权验证,禁止用户在校验失败的情况下继续访问。(特别是自己制作的证书,需要按照这篇文章的校验)

#import "HTTPSWebViewController.h"

@interface HTTPSWebViewController () <UIWebViewDelegate, NSURLConnectionDataDelegate> {
NSURLRequest *aRequest;
BOOL authenticated;
} @property(nonatomic, strong) IBOutlet UIWebView *webView; @end @implementation HTTPSWebViewController - (void)viewDidLoad{
[super viewDidLoad]; NSURL *url = [NSURL URLWithString:@"https://google.com"];
NSURLRequest *requestURL = [NSURLRequest requestWithURL:url];
[self.webView loadRequest:requestURL];
} #pragma mark - UIWebViewDelegate
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
BOOL result = authenticated;
if (!authenticated) {
aRequest = request;
NSURLConnection *urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[urlConnection start];
}
return result;
} #pragma mark - NSURLConnectionDataDelegate
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
} - (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
SecTrustRef trust = challenge.protectionSpace.serverTrust;
SecTrustResultType result; OSStatus status = SecTrustEvaluate(trust, &result);
if ((status == errSecSuccess) &&
((result == kSecTrustResultProceed) ||
(result == kSecTrustResultUnspecified))) { NSURLCredential *cred = [NSURLCredential credentialForTrust:trust];
[challenge.sender useCredential:cred forAuthenticationChallenge:challenge];
}
else {
[challenge.sender cancelAuthenticationChallenge:challenge];
}
} - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
authenticated = YES;
[connection cancel];
[self.webView loadRequest:aRequest];
} @end

  

  • 0x01: SSL 剥离攻击:网站并非全网 HTTPS,而只有需要进行明暗数据传输时才输入使用 HTTS 的漏洞。中间人攻击者在劫持了客户端与服务器的 HTTP 会话后,将 HTTP 页面所有的 https:// 超链接换成 http:// ,用户在点击相应的链接时,是使用 HTTP 协议来进行访问,这样,就算服务器对应的 URL 只支持 HTTPS 链接,但中间人一样可以和服务建立 HTTPS 链接之后,将数据使用 HTTP 协议转发给客户端,实现会话劫持。

    • 这种攻击手段更难以提防,因为它使用了 HTTP,不会让浏览器出现 HTTPS 证书不可信的警告,而且用户很少会起看浏览器上的 URL 是 https:// 还是 http:// 。特别是 App 的 webView中,一般把 URL 隐藏掉,用户无法直接查看 URL 出现异常。
    • 防范措施:

      1)这种攻击方法无法劫持 App 内的 HTTPS 连接会话,但在 webView 中打开网页需要注意,在非全网 HTTPS 的网站,建议对 WebView 中打开的 URL 做检查,检查应该使用 https:// 的 URL 是否被篡改为 http://。

      2)建议服务器在配置 HTTPS 服务时,也加上 "HTTP Strict Transport Security" 配置项。

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {

    NSURL* baseURL = [NSURL URLWithString:@"https://google.com"];
if ([challenge.protectionSpace.host isEqualToString:baseURL.host]) {
SecTrustRef trust = challenge.protectionSpace.serverTrust;
SecTrustResultType result; OSStatus status = SecTrustEvaluate(trust, &result);
if ((status == errSecSuccess) &&
((result == kSecTrustResultProceed) ||
(result == kSecTrustResultUnspecified))) { NSURLCredential *cred = [NSURLCredential credentialForTrust:trust];
[challenge.sender useCredential:cred forAuthenticationChallenge:challenge];
}
else {
// 3)验证失败,取消这次验证流程
[challenge.sender cancelAuthenticationChallenge:challenge];
}
}
else {
[challenge.sender cancelAuthenticationChallenge:challenge];
}
}

  

  • 0x02: 针对 SSL 算法进行攻击: 上述两种方式,技术含量较低,而且一般只影响 WebApp,很难攻击 Native App,所以高阶的 Hacker,会直接针对 SSL 算法相关漏洞进行攻击,期间会使用很多密码学相关手段。

      1)只支持尽量高版本的 TLS;

      2)禁止一些已爆出安全隐患的加密方法;

      3)使用 2048 位的数字证书;

  中间人攻击的模拟实验参考

    

二、正确的检验证书方法

  • 域名验证

    iOS 系统 API 是默认开启 validateDomainName 的,但注意 AFNetworking 在 2.5.2 以前存在漏洞,ValidatesDomainName 默认为 No,也就是只要是可信的 CA 机构签发,都校验通过。

  • 检验证书链 (讨论 AFNetworking 中 validatesCertificateChain 的问题)

    1) 在 AFNetworking V2.6.0 已经删除掉该属性;

    2) 是将 App 本地打包好的证书与服务器返回的证书进行数据的一一对比,只有打包到 App的证书中包含了服务器返回的证书链上的所有证书,校验才会通过。

      也就是说,开启了 validatesCertificateChain 后,访问 https://google.com,需要将 GeoTrust Global CA、Google Intenet Authority G2、google.com 的证书都倒入到 App 中才能验证通过。(不过这是完全没有必要的)

    

  • 打包证书校验

  用户设置系统信任证书,会作为锚点证书 (Anchor Certificate) 来验证其他证书,当返回的服务器证书是锚点证书或基于该证书签发的证书都会被信任。这就是基于信任链校验方式的最大弱点。我们不能完全相信系统的校验,因为系统的校验依赖的证书源可能被污染了。这就需要选取一个节点证书,打包到 App 中,作为 Anchor Certificate 来保证证书链的唯一性和可靠性。

SecTrustSetAnchorCertificates(SecTrustRef trust, CFArrayRef anchorCertificates)

  如果单纯调用了 SecTrustSetAnchorCertificates 方法后不调用 SecTrustSetAnchorCertificatesOnly 来验证证书,则只会相信 SectrustAnchorCertificates 传入的证书,而不会信任其他锚点证书。这意味着只相信传入的锚点证书,也就是只会验证通过由这些锚点证书签发的证书。这样就算被验证的证书是由系统其他信任的锚点证书签发,也无法验证通过。

  对于自建证书来说,选择哪一个节点都可以,而对于 CA 颁发的证书,则建议导入颁发该证书的 CA 机构证书或者更上一级的 CA 机构证书,甚至可以是根证书。原因是:

    1)叶子证书有限期较短

    2)越往证书链的末端,证书越有可能变动;

四、调试 SSL/TLS

  • SSL 相关的错误码在 <Security/SecureTransport.h> 中定义;
  • 这一阶段的不能使用 charles 来抓包分析了,因为 Charles作为 HTTP 代理工作的,它会抓取代理的网络,然后将报文组合成 HTTP/HTTPS 协议包,对于 HTTP 非常方便,但对于细节的缺失,没办法使用它来分析 SSL 相关的错误,需要使用 wireshark(介绍使用的文章)。
  • 有时候抓取的包只有 client hellod 和  serverhello。再没有发送证书的,也就是 SSL 和 TLS 的 session 重用。

五、

HTTPS 进阶的更多相关文章

  1. iOS安全系列之 HTTPS 进阶

    上一篇<iOS安全系列之一:HTTPS>被CocoaChina转载,还顺便上了下头条: 打造安全的App!iOS安全系列之 HTTPS,高兴之余也有些诚惶诚恐,毕竟那篇文章只是介绍了比较偏 ...

  2. AFNetWorking3.0使用 自签名证书的https请求

    前几日,项目组出于安全角度的考虑,要求项目中的请求使用https请求,因为是企业内部使用的app,因此使用了自签名的证书,而自签名的证书是不受信任的,所以我们就需要自己来做证书的验证,包括服务器验证客 ...

  3. 【原】AFNetworking源码阅读(六)

    [原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...

  4. fir.im Weekly - iOS9 适配开发教程

    期待已久的 iOS 9 发布了,很多人更新完毕得出结论:这是值得升级的版本.随之而来的是适应 iOS9 开发技术.本期 Weekly 收集了一些关于 iOS9 相关的开发资源,希望对你有帮助. iOS ...

  5. Nodejs进阶:核心模块https 之 如何优雅的访问12306

    本文摘录自<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址.欢迎加群交流,群号 197339705. 模块概览 这个模块的重要性,基本不用强调了.在网络安全问题日益严 ...

  6. 移动端https抓包那些事--进阶篇

    上一次和大家介绍了手机端https抓包的初级篇,即在手机未root或者未越狱的情况下如何抓取https流量,但是当时分析应用时会发现,好多应用的https的流量还是无法抓取到,这是为什么呢? 主要原因 ...

  7. Android进阶(三)android httpClient 支持HTTPS的访问方式

    项目中Android https请求地址遇到了这个异常(无终端认证): javax.net.ssl.SSLPeerUnverifiedException: No peer certificate 是S ...

  8. Android进阶(二)https请求No peer certificate的解决方法.

    在做Android客户端通过https协议访问12306,并爬取数据时,出现了如下错误: 其中有一条错误提示是 javax.net.ssl.SSLPeerUnverifiedException: No ...

  9. Java进阶(三)Java安全通信:HTTPS与SSL

    通过一个系统,接触到了Java安全机制,故作一小节,供朋友们参考学习. 1. HTTPS概念 1)简介 HTTPS(全称:Hypertext Transfer Protocol over Secure ...

随机推荐

  1. Spark集群部署

    Spark是通用的基于内存计算的大数据框架,可以和hadoop生态系统很好的兼容,以下来部署Spark集群 集群环境:3节点 Master:bigdata1 Slaves:bigdata2,bigda ...

  2. STL_lower_bound&upper_bound用法

    ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, la ...

  3. CPrimerPlus第十一章中的“选择排序算法”学习

    C Primer Plus第十一章字符串排序程序11.25中,涉及到“选择排序算法”,这也是找工作笔试或面试可能会遇到的题目,下面谈谈自己的理解. 举个例子:对数组num[5]={3,5,2,1,4} ...

  4. C#运算符

    运算符 1.算数运算符 赋值运算符 等号在C#中并不是表示相等的意思,而是表示赋值,把等号右边的值赋值给 等号左边的变量 由等号连接的表达式,叫做赋值表达式.我们要求等号两边的数据类型必须一 致. 2 ...

  5. 最小生成树的Kruskal算法实现

    最近在复习数据结构,所以想起了之前做的一个最小生成树算法.用Kruskal算法实现的,结合堆排序可以复习回顾数据结构.现在写出来与大家分享. 最小生成树算法思想:书上说的是在一给定的无向图G = (V ...

  6. springMVC 的工作原理和机制

    工作原理上面的是springMVC的工作原理图: 1.客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServlet的请求映射路径(在web. ...

  7. 与你相遇好幸运,mocha接口测试

    var rest = require('restler');var assert = require("assert");var systemID;var userID; cons ...

  8. UWP webview 键盘bug,回退页面,键盘会弹一下。

    最新项目发现一个关于Webview的键盘bug. 具体问题:当点击Webview 网页里面input之类的东东,输入键盘会弹出来,这个时候,按回退键,键盘会收起来,再按回退键,界面会退到前一个页面,但 ...

  9. 12 自定义标签/JSTL标签库/web国际化/java web之设计模式和案例

    EL应用      自定义一个标签,实现两个字符串的相加 1回顾      1.1servlet生命周期           init(ServletConfig)           service ...

  10. [开源]用MQL4实现MD5加密

    本文转载自博客园:混沌的世界 原文地址:http://www.cnblogs.com/niniwzw/archive/2009/12/05/1617685.html 在用MQL4进行金融交易的时候,经 ...