HTTPS握手及数字证书验证(简解)

HTTPS通信涉及的通信协议层次模型:

||HTTP||
||SSL/TLS||
||TCP||
||IP||
||Ethernet||


HTTPS通信流程:

  1. 同服务器建立TCP连接;
  2. ssl/tls握手过程;
  3. 采用握手过程client和server确定的对称秘钥进行加密通信(对http的报文进行加密)。

 

SSL/TLS握手过程:

  1. client向server发送自己支持的SSL版本/支持的加密算法/随机数1(用于生成对称秘钥);
  2. server回复使用的SSL版本/用于对称秘钥加密交换用的非对称加密算法/对称加密算法/MAC算法/随机数2(用于生成对称秘钥)/从CA获取的数字证书;
  3. client接收并校验数字证书,生成随机数3(并集合随机数1和2生成对称秘钥)并用server的公钥加密后发送给server,并发送change_cippher_spec告知server后面数据交互开始使用对称秘钥加密,结束握手;
  4. server采用私钥解密随机数3,并结合随机数1和2生成和client端相同的对称秘钥,同样的发送change_cippher_spec告知client后面数据交互开始使用对称秘钥加密,结束握手。

 

数字证书格式:

证书标准规范X.509规定了数字证书的格式。数字证书由CA(Certificate Authority)授权机构颁发,简单的说数字证书由描述信息,证书申请者的公钥,以及数字签名(描述信息和公钥的HASH指纹,CA采用自己的私钥加密HASH指纹后得到)组成,也可以看做由明文部分(描述信息和公钥)和明文的加密部分(数字签名)组成。

明文部分:
版本号/序列号/签名算法/颁发者/有效期/主体(公钥算法,主体公钥)/颁发者唯一号/主体唯一号/扩展

举例:一台HTTPS服务器向CA申请数字证书(当然客户端也可以申请数字证书并在交互式发送给服务器)

 

数字证书的校验:

一般校验方法:

校验数字证书的有效性(如浏览器使用的方法),主要分为三个部分:

  • 数字证书有效期验证
  • 根证书验证(证书链验证)
  • CRL验证

 

怎样校验数字证书?:

1. 有效期验证:

证书的使用时间要在起始时间和结束时间之内,通过解析证书很容易得到证书的有效期。

2. 根证书验证:

 先来理解一下什么是根证书?
        普通的证书一般包括三部分:描述信息,用户公钥,以及CA签名
        那么我们要验证这张证书就需要验证CA签名的真伪。那么就需要CA公钥。而CA公钥存在于另外一张证书(称这张证书是对普通证书签名的证书)中。因此我们又需要验证这另外一张证书的真伪。因此又需要验证另另外证书(称这张证书是对另外一张证书签名的证书)的真伪。依次往下回溯,就得到一条证书链。那么这张证书链从哪里结束呢?就是在根证书结束(即验证到根证书结束)。根证书是个很特别的证书,它是CA中心自己给自己签名的证书(即这张证书是用CA公钥对这张证书进行签名)。信任这张证书,就代表信任这张证书下的证书链。
        所有用户在使用自己的证书之前必须先下载根证书。
       所谓根证书验证就是:用根证书公钥来验证该证书的颁发者签名。所以首先必须要有根证书,并且根证书必须在受信任的证书 列表(即信任域)。

3. CRL验证:

 CRL是经过CA签名的证书作废列表,用于证书冻结和撤销。一般来说证书中有CRL地址,供HTTP或者LDAP方式访问,通过解析可得到CRL地址,然后下载CRL进行验证。
     并且证书中有CRL生效日期以及下次更新的日期,因此CRL是自动更新的,因此会有延迟性。
     于是呢,还有另外一种方式OSCP证书状态在线查询,可以即时的查询证书状态。

转自:《证书有效性验证、根证书

 

证书锁定技术(SSL Pinning):

  • 数字证书锁定
  • 公钥锁定

为什么要采用证书锁定技术?:

主要是为了防范中间人攻击:

如果用户手机中安装了一个恶意证书,那么就可以通过中间人攻击的方式进行窃听用户通信以及修改request(请求)或者response(答复,响应)中的数据。

1 、客户端在启动时,传输数据之前需要客户端与服务端之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。

2 、中间人在此过程中将客户端请求服务器的握手信息拦截后,模拟客户端请求给服务器(将自己支持的一套加密规则发送给服务器),服务器会从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给客户端。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。

3 、而此时中间人会拦截下服务端返回给客户端的证书信息,并替换成自己的证书信息。

4、 客户端得到中间人的response后,会选择以中间人的证书进行加密数据传输。

5 、中间人在得到客户端的请求数据后,以自己的证书进行解密。

6 、在经过窃听或者是修改请求数据后,再模拟客户端加密请求数据传给服务端。就此完成整个中间人攻击的过程。

转自:《证书有效性验证、根证书

 

1. 数字证书锁定:

client通过带外方式获取server的数字证书,譬如通过email的方式,然后将数字证书嵌入到你的APP中。当连接server时,通过对比从server端接受到的数字证书和APP中内嵌的数字证书是否相同即可判断连接的安全性;

缺点是:数字证书需要定期轮转更新,譬如Google每月更新一次,那么client的APP也需要每月更新一次。

2. 公钥锁定:

client从通过带外方式湖区server的数字证书,并从数字证书中提取出server的公钥,通过比较公钥判断连接的安全性‘

缺点:从数字证书中提取公钥可能有一点麻烦,另外公钥也是需要定期轮转更新的所以client端APP也需要更新(不过公钥更新的频率应该比数字证书更新频率低)。

指纹锁定:

无论是数字证书锁定还是公钥锁定,都需要将相关信息嵌入到APP中,这样入侵者可以通过逆向工程(反编译)窃取到数字证书和公钥,指纹锁定是在前两者的基础上采用数字证书和公钥的指纹实现,将其指纹嵌入到APP中,利用指纹的不可逆性来保证数字证书和公钥的安全。

优点:能够防止逆向工程窃取有用信息;从获取数字证书和公钥的数字指纹一般具有库API可供使用;可以使用备份指纹,例如GoogleIETF的 websec-key-pinning技术。

参考《Certificate and Public Key Pinning

发布了13 篇原创文章 · 获赞 7 · 访问量 2万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章