HTTPS协议其实就是HTTP over TSL,TSL(Transport Layer Security) 传输层安全协议是https协议的核心。
TSL可以理解为SSL (Secure Socket Layer)安全套接字层的后续版本。目前应用的最广泛的 TLS 是 1.2,而之前的协议(TLS1.1/1.0、SSLv3/v2)都已经被认为是不安全的了
TLS握手过程
由于HTTPS的实质是在TLS握手后建立的安全通道上进行的HTTP请求,因此本文只介绍TLS握手过程的几个关键步骤:
1.客户端向服务端发起请求,将一个随机数、自己的TLS版本号、Cipher Suite加密算法列表(告知服务器自己支持哪些加密算法)等发给服务端。
2.服务端将自己的证书、一个随机数、TLS版本、从Cipher Suite加密算法列表中选择使用的加密算法等发给客户端。
3.服务端继续将交换算法(ECDHE)公钥发送给客户端,一般只在服务端选择使用DHE 和DH_anon等加密算法组合时才会由服务器发出。
4.客户端验证证书(验证过程后文介绍),如果验证通过后,客户端将自己的交换算法(ECDHE)公钥发给服务端,一般只在服务端选择使用DHE 和DH_anon等加密算法组合时才会由服务器发出。
5.客户端随后用两个随机数+服务端交换算法(ECDHE)公钥配合自己的交换算法(ECDHE)私钥生成一个加密密钥key1,并且用key1加密一条消息发给服务端。
6.服务端收到消息后用两个随机数+客户端交换算法(ECDHE)公钥配合自己的交换算法(ECDHE)私钥生成一个加密密钥key2,并且用key2加密一条消息发给客户端,由于交换算法(ECDHE)可以保证key2等于key1,所以双方就有了一样的对称加密key进行加解密是,而且key1和key2并没有进行传输,所以第三方无法获取。
注意:以上步骤3、4是服务端在选择了DHE 和DH_anon等加密算法组合时才有,如果选择了其他非对称加密算法,则直接跳到5,并且在步骤5、6中的没有key1和key2,而是如下:
5.客户端生成一个key,然后用证书里得到的服务端公钥加密这个key,然后发给服务端,接着用这个key加密一条消息发给服务端。
6.服务端用自己的私钥解密得到key,并且用key加密一条消息发给客户端。
7.至此,TLS握手完成,后续HTTP请求的内容都用key1和key2(或者key)进行加密通信。
如果使用固定的公私钥算法有一定的安全风险,如:私钥泄露,因此交换算法(ECDHE)是一种更安全的加密方式。
如图所示基于交换算法(ECDHE)的TLS握手过程:
客户端如何验证证书的可靠性?
数字签名和数字证书
数字签名:
数字签名就是用HASH算法将一段内容生成固定长度的hash值,相同的内容一定生成相同的hash值,然后用CA私钥将hash值h1加密得到数字签名,所以数字签名就是用来保证内容没有被篡改的。
数字证书:
数字证书就是某个权威机构颁发的包含了有效期、服务端公钥信息和它加密算法、颁发者、用CA私钥加密的证书的数字签名等信息的证书。
一般权威机构的证书都会内置在系统或者浏览器里,浏览器在收到服务端的证书后,根据证书颁发者信息就去找内置的证书,找到后用内置证书的CA公钥解密数字证书得到证书hash值h1,然后用内置证书对应的hash算法对收到的证书内容进行hash计算,得到hash值h2,如果h1等于h2就证明收到的证书安全可靠。
这里注意内置证书的CA公钥和证书里的服务端公钥的区别,内置CA公钥用来解密数字签名,服务端公钥用来协商私钥。
参考资料: