定义
HTTP over SSL的简称,即工作在SSL(或TLS)上的HTTP。就是在HTTP之下增加的一个安全层,用于保障HTTP的加密传输
SSL:Secure Sockets Layer
TLS:Transport Layers Security
工作原理
在客户端和服务器之间协商出一套对称密钥,每次发送消息之前将内容加密,收到之后解密,达到内的加密传输。
HTTP发送消息之前,先报文交给TLS进行加密再发送给TCP
HTTP接受消息之前,TCP接收的报文先交给TLS进行解密再交给HTTP
为什么不使用非对称加密
非对称加密由于使用了复杂的数学原理,计算相当复杂,如果使用非对称加密来加密通信内容,会严重影响网络通信的性能
HTTPS连接建立过程
大致内容可以分为如下:
- 客户端请求建立TLS连接
- 服务器返回证书
- 客户端验证服务器证书
- 客户端信任服务器后,和服务器协商对称密钥
- 使用对称密钥开始通信
- ClientHello
- ServerHello
- 服务器证书信任建立
- Pre-masterSecret
- 客户端通知:将使用加密通信
- 客户端发送:Finished
- 服务器通知:将使用加密通信
- 服务器发送:Finished
客户端:client hello
- 可选的TLS版本
- 可选的加密套件
- 可选的对称加密算法
- 可选的非对称加密算法
- 可选的hash算法
- 客户端随机数
服务器:server hello
- 选出加密套件
- 对称加密算法
- 非对称加密算法
- hash算法
- 服务端随机数
PS:此时客户端和服务端都有两个相同的随机数
服务器:发送服务器证书
- 服务器主机名
- 服务器公钥(元数据)
- 服务器公钥的签名(用私钥对元数据公钥的hash值进行非对称加密)
- 用于验证这个公钥签名的另一个公钥
PS:验证公钥的可行性,递归到根证书,信任签发机构
客户端:Pre-master secret
使用服务器发送过来的公钥对一个随机数进行加密,发送给服务器。服务端会使用它的私钥对Pre-master secret解密的到这个随机数。
客户端和服务端hello中的随机数、Pre-master secret随机数共同生成一个master secret。最终会得到客户端加密密钥、服务端加密密钥、客户端MAC secret、服务端MAC secret。客户端和服务端双方都会持有这些密钥。
- 客户端给服务端发送消息,会用客户端加密密钥,服务端会用客户端加密密钥解密
- 服务端给客户端发送消息,会用服务端加密密钥,客户端会用服务端加密密钥解密
为什么客户端和服务端发送消息用不同的密钥:
但是有种可能,A给B发送消息,消息被劫持,虽然无法解密消息,但直接返回给A,就会导致消息错乱。比如你女朋友和你说:我们分手吧。劫持消息直接返回给你的女朋友,那你们就over,如果客户端和服务端发送消息用不同的密钥,就可避免这种情况。
PS:为什么要使用三个随机数:
不管是客户端还是服务器,都需要随机数,这样生成的密钥才不会每次都一样。由于SSL协议中证书是静态的,因此十分有必要引入一种随机因素来保证协商出来的密钥的随机性。对于RSA密钥交换算法来说,pre-master secret本身就是一个随机数,再加上hello消息中的随机,三个随机数通过一个密钥导出器最终导出一个对称密钥。pre-master secret的存在在于SSL协议不信任每个主机都能产生完全随机的随机数,如果随机数不随机,那么pre-master secret就有可能被猜出来,那么仅适用pre-master secret作为密钥就不合适了,因此必须引入新的随机因素,那么客户端和服务器加上pre-master secret三个随机数一同生成的密钥就不容易被猜出了,一个伪随机可能完全不随机,可是是三个伪随机就十分接近随机了,每增加一个自由度,随机性增加的可不是一。