在网络上看了很多文章,感觉都说的不是很完整,很多重要细节没有交代清楚,所以决定写一篇文章记录一下学习过程。
概念名词解释
HTTPS是什么?
HTTPS其实就是http secure的意思,也就是HTTP的安全升级版。HTTP是应用层协议,位于HTTP协议之下是传输协议TCP。TCP负责传输,HTTP则定义了数据如何进行包装。
HTTP --> TCP (明文传输)
HTTPS相对于HTTP有哪些不同呢?其实就是在HTTP跟TCP中间加多了一层加密层TLS/SSL。
TLS/SSL是什么?
通俗的讲,TLS、SSL其实是类似的东西,SSL是个加密套件,负责对HTTP的数据进行加密。TLS是SSL的升级版。现在提到HTTPS,加密套件基本指的是TLS。
对称加密是什么?
加密用的密钥和解密用的密钥是一样的。
优点:算的快,效率高。
缺点:密钥一旦泄露,等于明文,且容易被篡改,维护密钥成本高。
常见算法:AES、DES、TripleDES、RC2、RC4、RC5和Blowfish等
非对称加密是什么?
密钥分公钥和私钥,通过公钥加密的数据,可以用私钥进行解密。私钥加密的数据用公钥也可以进行解密。一般公钥是公开的,私钥只保存一份在服务端。
优点:加密更安全,只要私钥不泄露,那么就可以认为数据是不能被解密的。
缺点:计算成本高,效率低。
常见算法:RSA、DES
CA根证书是什么?
CA证书本质上也是一个数字证书,是用来验证CA身份的,浏览器或者操作系统会内置大多数主流权威的CA根证书,里面包含CA的公钥等信息。
数字证书是什么?
数字证书部分可以参考:https://www.jianshu.com/p/3371740b7b02
数字证书(digital certificate),又叫做公钥证书(public key certificate)或者身份证书(identity certificate),是一种证明公钥拥有者的电子文档。
数字证书重要内容包括:
- 公钥
- 公钥拥有者的身份识别信息
- 验证本证书内容的的数字签名
- 网站域名
- 有效期
- 加密算法
- 等
注意:这些内容都是明文的,并没有加密,很多文章说证书里的公钥是加密后的,需要用CA根证书公钥解密,其实是错误的。存储的时候是DER 二进制存储或者其他格式。
数字签名怎么生成的?
- 对证书关键内容(公钥、有效期、身份识别信息等)进行hash计算,获得信息摘要
- 由证书颁发机构的私钥对信息摘要进行加密货的数字签名
生成信息摘要部分可以简化这么理解,不影响整个流程。
HTTPS证书生成
生成
- 服务器管理员生成一对公钥和私钥
- 管理员把公钥传给证书颁发机构CA,然后申请证书
- 证书中包含上面服务器的公钥
客户端与服务器交互流程
-
首先,客户端(通常是浏览器)先向服务器发出加密通信的请求,这被叫做ClientHello请求。在这一步,客户端主要向服务器提供以下信息。
- 支持的协议版本,比如TLS 1.0版。
- 一个客户端生成的随机数,稍后用于生成"对话密钥1"。
- 支持的加密方法。
- 支持的压缩方法。
image.png -
服务器收到客户端请求后,向客户端发出回应,这叫做SeverHello。服务器的回应包含以下内容。
- 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
- 一个服务器生成的随机数,稍后用于生成"对话密钥2"。
- 确认使用的加密方法,比如AES对称加密。
- 服务器证书。
image.png
-
客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。
如果证书没有问题,客户端就会从证书中取出服务器的公钥。然后,向服务器发送下面三项信息。这里的公钥获取,有的地方说是服务端会单独再发一次,Server Key Exchange,但都是明文传递的,所以这里的细节出入并不影响整个流程的安全性
- 一个随机数(pre-master key)。该随机数用服务器公钥加密,生成对话密钥3,防止被窃听。
- 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
- 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。
验证证书合法性的大概流程是:
1、 先获取证书中的CA名字,然后从系统中找到对应的根证书,获得根证书里的公钥。如果不是可信任的机构就中断流程
2、对获取的服务的证书的数字签名进行解密,获得信息摘要
3、对服务端证书进行同样算法的hash计算,和上一步的信息摘要进行比较,一致则认为没有被篡改过 -
服务器的最后回应
服务器收到客户端的第三个随机数加密后的对话密钥后,用服务端的私钥解密获得pre-master key。
这时服务端和客户端分别都有2个随机数密钥和一个pre-master key,三个密钥相加再按协商好的对称加密算法进行加密,获得本次会话最终的会话密钥。
然后,向客户端最后发送下面信息。- 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
- 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。
后面的数据传输都用刚才生成的会话密钥进行加密传递,至此整个流程结束。
借用B站up主【技术蛋老师】的一张图,b站链接:https://www.bilibili.com/video/BV1KY411x7Jp
一些问题
Q:证书里的公钥是明文传递的,不怕中间人截取吗?
A:中间人可用截取公钥,但无法篡改替换成自己的公钥,因为一旦修改,证书的数字签名就验证不通过了。
Q:就算不能篡改,三次传递的密钥都是明文的,是不是就能截取服务端和客户端的通信内容了呢,这不还是裸奔吗?
A:三个密钥虽然都是明文传递的,但第三次的密钥是用公钥加密后的,要想生成对称加密的密钥,需要先对第三次的密钥进行解密,但只有私钥可以解密,公钥是不能对自己加密的内容进行解密的,所以生成的对称密钥无法被破解,数据是安全的。