https其实就是加密通信的http。
在了解https之前,我们首先需要知道几个重要的概念。
- 对称加密:通信双方使用同一个秘钥,使用加密算法配合秘钥对原文进行加密得到密文,解密时使用完全逆过程的解密算法配合秘钥对密文进行解密得到原文。
- 非对称加密:使用公钥对原文进行加密得到密文,使用私钥对密文进行解密得到原文。
- 签名:对原文进行hash计算得到摘要信息,使用私钥对摘要信息进行加密(签名过程)得到加密后的摘要,将加密后的摘要附在原文的末尾组成签名后的数据。
- 验证:使用公钥和相同的加密算法对加密后的摘要信息进行解密得到待验证的摘要信息,然后对原文进行hash计算得到摘要信息,将两个摘要信息进行一致性校验。
- 数字证书:证书+数字签名(上述签名过程)。
了解了以上概念之后,那么接下来了解连接的过程:
- 客户端请求建立TLS连接。
- 客户端会发送Client Hello,并且会携带部分参数,TLS版本号,客户端随机数,客户端密码套件等。
- 服务端响应:
- 服务端会返回Server Hello,同时将携带部分参数:TLS版本号,服务端随机数,确认的密码套件等。
- 紧接着会再次发送服务器数字证书,主要是为了客户端验证证书合法性并且获取证书内的公钥。
- 然后会发送交换秘钥通信,并将服务器生成的一些参数发送给客户端,为了后续会话通信的加密秘钥做准备。、
- 发送ServerHello Down表示握手完毕。
- 服务端会返回Server Hello,同时将携带部分参数:TLS版本号,服务端随机数,确认的密码套件等。
- 客户端验证证书:
- 客户端会使用本地的CA公钥去解密服务器返回的数字签名,得到摘要信息,使用证书里面hash算法对证书进行hash计算得到摘要信息,将两者摘要信息做对比,验证来源。
- 验证证书的基本信息,还有一些证书链。
- 证书验证通过后,客户端会根据服务器返回的参数生成一个随机数premaster secret并且使用证书里的公钥进行加密,然后通知服务器后续使用对称加密,并将此密文以参数形式发给服务器。
- 紧接着客户端会将之前发送的数据做一个摘要,然后使用对称加密秘钥(不是premaster secret)加密成密文发送给服务器。
- 服务器收到请求:
- 使用私钥解密得到premaster secret。
- 服务器也会将之前发送的数据做一个摘要,然后使用对称加密秘钥(不是premaster secret)加密成密文发送给客户端。
如果双方都验证加解密没问题,那么后续通信就使用对称加密通信进行http请求了。
加密秘钥生成过程:客户端和服务器含有以下数据
- 客户端随机数
- 服务器随机数
- premaster secret
客户端和服务器会通过这三个随机数生成一个mastersecret,通过mastersecret会生成一个对称加密套件:
- 客户端秘钥
- 服务器秘钥
- 客户端MAC secret
- 服务器MAC secret
MAC secret在数据发送前,一方会将明文使用密码套件里面的算法计算好MAC,然后将其放在加密数据中。另外一方接收到报文对密文使用对称加密算法解密成明文,再用密码套件里面的算法计算计算MAC,如果MAC匹配的化就认为报文是完好的,是一个验证的作用,防止被劫持篡改。 当双方都生成了对称加密套件之后,客户端发送消息使用客户端秘钥和客户端MAC secret进行加解密和验证,服务器发送消息使用服务器秘钥和服务器MAC secret加解密和验证。