前言

APP端抓包中, 设置抓包代理后会发现部分APP(如app store、Facebook)直接无法访问,其他部分app又功能正常,为什么呢?这涉及 ssl-pinning,证书锁定。

证书锁定(SSL/TLS Pining),顾名思义,将服务器提供的SSL/TLS证书内置到移动端开发的APP客户端内,当客户端发起请求时,通过对比内置的证书和服务器端证书的内容,以确定这个链接的合法性。

HTTPS与中间人攻击

HTTPS

  1. HTTPS实际上是由HTTP协议与TLS协议组合而成的一个协议。
  2. TLS协议作用于HTTPS建议客户端与服务端通信建立信任的过程;HTTP协议作用于客户端与服务端的正式通信过程,二者通信的数据是被TLS协议最终生成的密钥加密过。
  3. HTTPS建立连接过程会生成三个随机数,通过这三个随机数,客户端与服务端能够使用相同的算法生成后续HTTP通信过程中对接加密算法使用的密钥。
  4. HTTPS协议中,非对称加密只是在协议建立的过程,协议建立后使用的是对称加密。

中间人攻击

  1. 市面上的抓包软件的实现原理就是中间人攻击。

    1. TLS建立连接时,客户端生成的随机数1、服务端生成的随机数2都是明文,只有随机数3使用非对称加密技术加密。
    2. 中间人攻击的关键是截获服务器返回的证书并伪造证书发送给客户端骗取信任,获取随机数3,进而达成盗取信息的目的
  2. 客户端校验证书合法性的三种方式(这也是客户端容易被骗的原因):
    1. 查看证书是否过期
    2. 服务器证书上的域名是否和服务器的实际域名相匹配
    3. 校验证书链 ——因此,中间人攻击可以在终端手动添加信任根证书,即Charles/Fiddler抓包之前需要安装证书的原因。

ssl-pinning

1.概述

在公共网络中我们使用安全的SSL/TLS通信协议进行通信,并且使用数字证书来提供加密和认证。HTTPS的握手环节仍然面临(MIM中间人)攻击的可能性,因此CA证书签发机构也存在被黑客入侵的可能性,同时移动设备也面临内置证书被篡改的风险。

2.证书锁定原理

证书锁定(SSL/TLS Pinning)提供了两种锁定方式:

  • Certificate Pinning,证书锁定
  • Public Key Pinning,公钥锁定

2.1 证书锁定

  • 具体操作:将APP代码内置仅接受指定域名的证书,而不接受操作系统或者浏览器内置的CA根证书对应的任何证书。通过这种授权方式,保障了APP与服务端通信的唯一性和安全性,因此移动端APP与服务端(例如API网关)之间的通信可以保证绝对的安全。

  • 缺点:CA签发证书存在有效期问题,在证书续期后需要将证书重新内置到APP内。

2.2 公钥锁定

  • 具体做法:公钥锁定是提前证书中的公钥并内置到移动端APP内,通过与服务器对比公钥值来验证连接的合法性。
  • 优点:在制作证书密钥时,公钥在证书续期前后可以保持不变(即密钥对不变),所以可以避免证书有效期问题。

3.证书锁定指纹(hash)

  1. 获取移动端所需证书

    1. 如果是证书锁定,即获取证书的摘要hash
  2. 获取移动端所需公钥
    1. 如果是公钥锁定,则获取证书公钥的摘要hash

4.总结

证书锁定旨在解决移动端APP与服务端通信的唯一性。

  1. 实际通信过程中,如果锁定过程失败,那么客户端APP将拒绝针对服务端的所有SSL/TLS请求。
  2. Facebook/Twitter通过证书锁定以防止Charles/Fiddler等抓包工具的中间人攻击。

HTTPS入门, 图解SSL从回车到握手](https://link.zhihu.com/?target=https%3A//www.infinisign.com/faq/ssl-hello-process)

证书锁定SSL/TLS Pinning的更多相关文章

  1. https 单向双向认证说明_数字证书, 数字签名, SSL(TLS) , SASL_转

    转自:https 单向双向认证说明_数字证书, 数字签名, SSL(TLS) , SASL 因为项目中要用到TLS + SASL 来做安全认证层. 所以看了一些网上的资料, 这里做一个总结. 1. 首 ...

  2. 转: https 单向双向认证说明_数字证书, 数字签名, SSL(TLS) , SASL

    转自: http://www.cnblogs.com/mailingfeng/archive/2012/07/18/2597392.html 因为项目中要用到TLS + SASL 来做安全认证层. 所 ...

  3. 数字证书, 数字签名, SSL(TLS) , SASL .

    因为项目中要用到TLS + SASL 来做安全认证层. 所以看了一些网上的资料, 这里做一个总结. 1. 首先推荐几个文章: 数字证书: http://www.cnblogs.com/hyddd/ar ...

  4. (转)数字证书, 数字签名, SSL(TLS) , SASL

    转:http://blog.csdn.net/xueshanfeihu0/article/details/9154219 因为项目中要用到TLS + SASL 来做安全认证层. 所以看了一些网上的资料 ...

  5. SSL/TLS原理详解

    本文大部分整理自网络,相关文章请见文后参考. 关于证书授权中心CA以及数字证书等概念,请移步 OpenSSL 与 SSL 数字证书概念贴 ,如果你想快速自建CA然后签发数字证书,请移步 基于OpenS ...

  6. MINA、Netty、Twisted一起学(十一):SSL/TLS

    什么是SSL/TLS 不使用SSL/TLS的网络通信,一般都是明文传输,网络传输内容在传输过程中很容易被窃听甚至篡改,非常不安全.SSL/TLS协议就是为了解决这些安全问题而设计的.SSL/TLS协议 ...

  7. 跟我一起学Go系列:Go gRPC 安全认证机制-SSL/TLS认证

    Go gRPC 系列: 跟我一起学Go系列:gRPC 拦截器使用 跟我一起学Go系列:gRPC 入门必备 第一篇入门说过 gRPC 底层是基于 HTTP/2 协议的,HTTP 本身不带任何加密传输功能 ...

  8. 证书锁定Certificate Pinning技术

    证书锁定Certificate Pinning技术   在中间人攻击中,攻击主机通常截断客户端和服务器的加密通信.攻击机以自己的证书替代服务器发给客户端的证书.通常,客户端不会验证该证书,直接接受该证 ...

  9. SSL/TLS加密传输与数字证书解读

    什么是ssl? secure socket layer(ssl)协议最初由netscape企业发展,现已成为网络用来鉴别网站和网页浏览者身份,以及在浏览器使用者及网页服务器之间进行加密通讯的全球化标准 ...

随机推荐

  1. 测试:Oracle 19c RAC添加私网

    最近有个客户需求是在某12.2版本的RAC环境上添加心跳网络,顺便考虑将之前的心跳网络改为asm专用.我目前只有19c的RAC的测试环境(19c是12c的最终稳定版本),直接测试验证下过程备忘. 1. ...

  2. 在Asp.Net或.Net Core中配置使用MarkDown富文本编辑器有开源模板代码(代码是.net core3.0版本)

    研究如何使用Markdown你们可能要花好几天才能搞定,但是看我的文章或者下载了源码,你搞定一般在10分钟之内.我先给各位介绍下它: Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯 ...

  3. Git - Git分支管理策略

    前言 通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息. 如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的c ...

  4. javaweb 复习随笔

    js和jsp区分: js是一种脚本语言,常运行在前台和客户端交互,不会给服务器带来负担,可以更好的修饰静态页面 jsp可以说是servlet的一种,jsp会先翻译,翻译成Servlet执行,运行在服务 ...

  5. Java 正则初探

    正则表达 初探* 走进沼泽 问题引出 问题:判断一个String字符串是否为数字字符串 将字符串转换为字符数组 判断每一个字符是否在"0~9"范围之间 public class T ...

  6. jdbc大略

    一.概述JDBC JDBC从物理结构上说就是Java语言访问数据库的一套接口集合. 从本质上来说就是调用者(程序员)和实现者(数据库厂商)之间的协议. JDBC API: 使得开发人员可以使用纯Jav ...

  7. PHP代码篇(六)--如何根据邀请人id查询满足条件的会员上级

    说,如果有一个会员表,每一个会员都有一个邀请人from_id字段(记录该会员是谁邀请的),知道一个会员id,现在需要查询某一个会员是否是该会员的下级. 表如下: 一.当下需求 1.我们需要知道会员id ...

  8. Django 模板变量之 forloop

    1. 模板变量之forloop.counter:从1开始自增1 模板代码如下: {% for row in v %} <tr> <td>{{forloop.counter}}& ...

  9. Young and Beautiful 新红楼剪辑(by up)

    up剪辑的新红楼视频,配上Young and Beautiful 这首英文歌,很优美^_^

  10. python操作队列

    进行队列的操作,首先要引入queue这个库 一:设置队列(括号中是队列可容纳数据的多少,如果不设置,则可以一直增加) import queue q = queue.Queue(10) 二:添加/获取元 ...