HTTPS 进阶
一、中间人攻击
概念:攻击者插入到原本直接通信的双方,让双方以为还在直接跟对方通讯,但是实际上双方的通信对方已经变成中间人,信息已经被中间人获取或篡改。
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 算法相关漏洞进行攻击,期间会使用很多密码学相关手段。
- OpenSSL 漏洞
- 常见的 HTTPS 攻击方法
- 防范措施: 对服务端 SSL/TLS 的配置进行升级
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 进阶的更多相关文章
- iOS安全系列之 HTTPS 进阶
上一篇<iOS安全系列之一:HTTPS>被CocoaChina转载,还顺便上了下头条: 打造安全的App!iOS安全系列之 HTTPS,高兴之余也有些诚惶诚恐,毕竟那篇文章只是介绍了比较偏 ...
- AFNetWorking3.0使用 自签名证书的https请求
前几日,项目组出于安全角度的考虑,要求项目中的请求使用https请求,因为是企业内部使用的app,因此使用了自签名的证书,而自签名的证书是不受信任的,所以我们就需要自己来做证书的验证,包括服务器验证客 ...
- 【原】AFNetworking源码阅读(六)
[原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...
- fir.im Weekly - iOS9 适配开发教程
期待已久的 iOS 9 发布了,很多人更新完毕得出结论:这是值得升级的版本.随之而来的是适应 iOS9 开发技术.本期 Weekly 收集了一些关于 iOS9 相关的开发资源,希望对你有帮助. iOS ...
- Nodejs进阶:核心模块https 之 如何优雅的访问12306
本文摘录自<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址.欢迎加群交流,群号 197339705. 模块概览 这个模块的重要性,基本不用强调了.在网络安全问题日益严 ...
- 移动端https抓包那些事--进阶篇
上一次和大家介绍了手机端https抓包的初级篇,即在手机未root或者未越狱的情况下如何抓取https流量,但是当时分析应用时会发现,好多应用的https的流量还是无法抓取到,这是为什么呢? 主要原因 ...
- Android进阶(三)android httpClient 支持HTTPS的访问方式
项目中Android https请求地址遇到了这个异常(无终端认证): javax.net.ssl.SSLPeerUnverifiedException: No peer certificate 是S ...
- Android进阶(二)https请求No peer certificate的解决方法.
在做Android客户端通过https协议访问12306,并爬取数据时,出现了如下错误: 其中有一条错误提示是 javax.net.ssl.SSLPeerUnverifiedException: No ...
- Java进阶(三)Java安全通信:HTTPS与SSL
通过一个系统,接触到了Java安全机制,故作一小节,供朋友们参考学习. 1. HTTPS概念 1)简介 HTTPS(全称:Hypertext Transfer Protocol over Secure ...
随机推荐
- .NET LINQ 限定符操作
限定符操作 限定符运算返回一个 Boolean 值,该值指示序列中是否有一些元素满足条件或是否所有元素都满足条件. 方法 方法名 说明 C# 查询表达式语法 Visual Basic 查询表 ...
- Nginx 反代理其他搜索引擎
反向代理 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客 ...
- 基于类的命令行notebook的实现
在看一本书<PYTHON3 面向对象编程> 内容丰富,作作记录. notebook.py __author__ = 'chengang882' import datetime # Stor ...
- 基于GMap.Net的地图解决方案
一 地图的加载与显示 关于GMap的介绍与使用可以看我以前的文章: GMap.Net开发之在WinForm和WPF中使用GMap.Net地图插件 GMap.Net是.Net下一个地图控件,可以基于Ht ...
- AdaBoost算法分析与实现
AdaBoost(自适应boosting,adaptive boosting)算法 算法优缺点: 优点:泛化错误率低,易编码,可用在绝大部分分类器上,无参数调整 缺点:对离群点敏感 适用数据类型:数值 ...
- [leetcode] 29. divide two integers
这道题目一直不会做,因为要考虑的corner case 太多. 1. divisor equals 0. 2. dividend equals 0. 3. Is the result negative ...
- DDD~概念中的DDD(转)
概念中的DDD DDD: 领域驱动设计,它是对面向对象的的分析和设计(OOAD,Object Orient Analysis Design)的一个补充,对技术框架进行了分层规划,同时对每个类进行了策略 ...
- java 猜数字游戏
作用:猜数字游戏.随机产生1个数字(1~10),大了.小了或者成功后给出提示. 语言:java 工具:eclipse 作者:潇洒鸿图 时间:2016.11.10 >>>>> ...
- sql Lloader
create table ban_ji(id integer,ban_ji varchar2(25))insert into ban_ji values(1,'1-(1)');insert into ...
- 【Spring RCP】 RULES规则
Rich Client 约束规则 1.Constraint 定义了一个约束接口,接口中只有1个方法 public boolean test(Object argument); //这个方法指对约束的检 ...