# 05 SSL-TLS四次握手

## 一: 图解四次握手

![](https://raw.githubusercontent.com/RyukieSama/RyukieImage/master/Blog/TLS%E5%9B%9B%E6%AC%A1%E6%8F%A1%E6%89%8B.png)

## 二: 数字证书

> 数字证书是一个电子文档, 其中包含了持有者的信息/公钥/证明证书有效的数字签名. 数字证书室友证书认证机构(CA)来负责签发管理 数字证书的类型有多种,HTTPS使用的是SSL证书

### CA组织的结构

* CA组织顶层是根CA
* 根CA下可以授权给多个二级CA
* 二级CA又可以授权给多个三级CA
  * 那么是不是可以无限信任下去呢?
    * 显然不行(`Basic Constraint校验漏洞`)
    * X.509证书中的`Basic Constraint`包含了这是不是一个CA机构，以及有效证书路径的`最大深度`（即，这个CA还能否继续签发CA机构证书及其签发子CA证书的路径深度）

> SSL证书市场,主要被Symantec(旗下有VeriSign和GeoTrust)、Comodo SSL、Go Daddy 和 GlobalSign 瓜分了

### 签发流程

![](https://raw.githubusercontent.com/RyukieSama/RyukieImage/master/Blog/CA%E7%AD%BE%E5%8F%91%E6%95%B0%E5%AD%97%E8%AF%81%E4%B9%A6%E6%B5%81%E7%A8%8B.png)

数字证书的签发机构CA，在接收到申请者的资料后进行核对并确定信息的真实有效，然后就会制作一份符合X.509标准的文件。证书中的证书内容包含的持有者信息和公钥等都是由申请者提供的，而数字签名则是CA机构对证书内容进行hash加密后得到的，而这个数字签名就是我们验证证书是否是有可信CA签发的数据。

### 验证流程

![](https://raw.githubusercontent.com/RyukieSama/RyukieImage/master/Blog/CerValiate%E8%AF%81%E4%B9%A6%E9%AA%8C%E8%AF%81.png)

1. 接收到一份数字证书Cer1后,对证书内容做Hash得到数字摘要H1
2. 从签发该证书的机构CA1的证书中找到公钥,对证书上的签名进行解密,得到证书Cer1签名的Hash摘要H2
3. 对比H1 H2 如果相等表示证书没有被篡改(还未知有效性)
4. CA机构的数字证书是公开的,所有人都可以拿到.这个证书中的数字签名是上一级生成的,所以可以一直验证下去,直到根证书.根CA证书是自验证的(即数字签名是用自己的私钥生成了).合法的根CA证书会被浏览器和操作系统加入到信任CA列表中,这样完成了最终验证

> 注意: 一定要保护好自己的环境(浏览器,操作系统)中的根CA证书信任列表,信任了根证书就代表任何根证书下的字CA签发的证书,所以不要随便添加根CA证书信任

* iOS中的验证流程
  * 先获取到需要验证的信任对象
  * 使用系统默认的验证方式验证(自建证书不用,不在信任列表中)
  * 第二步验证通过后就可以直接通过了,建立连接
  * 验证不通过,取消验证流程,拒绝连接请求

## 参考

> <http://oncenote.com/2014/10/21/Security-1-HTTPS/> Jaminzzhang博客 <http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html> 阮一峰 <http://www.ruanyifeng.com/blog/2014/02/ssl\\_tls.html> 阮一峰
