HTTPS是HTTP协议在TLS/SSL加密协议下的安全传输方式。TLS是TLS/SSL加密协议的新版本,TLS协议握手过程如下:
TLS握手过程
- 客户端发送一个Client Hello消息给服务器端,这个消息包含TLS支持的协议版本、加密算法列表和随机数等信息。
markdown
# 客户端Hello包
- 服务器端收到Client Hello后,发送一个Server Hello消息给客户端,这个消息包含服务端选择的TLS协议版本、加密算法、证书以及一个随机数等信息。
markdown
# 服务器端Hello包
- 接下来,服务器端发送一个Certificate消息,这个消息包含证书链,包括服务器证书和中间CA证书等。
markdown
# 服务器端Certificate包
- 客户端对服务器端的证书进行验证,如果验证失败,可能会提示证书不合法或者提醒用户风险较高。如果验证成功,客户端生成一个预主密钥,然后用服务器端发来的公钥来加密预主密钥。客户端发送一个Client Key Exchange消息给服务器。
markdown
# 客户端Key Exchange包
- 服务器端使用私钥解密客户端发来的预主密钥,并且生成本次会话的主密钥。服务器发一个Server Key Exchange消息给客户端,这个消息包含服务器的数字签名,使用主密钥来保证消息的完整性。
markdown
# 服务器端Key Exchange包
- 之后,服务器端发送一个Server Hello Done消息告诉客户端握手阶段结束。
markdown
# 服务器端Hello Done包
- 客户端也生成会话的主密钥。然后,客户端发送一个Change Cipher Spec消息,告诉服务器端:接下来的消息都会使用新的主密钥和加密算法。最后,客户端发送一个Finished消息给服务器端。
markdown
# 客户端Finished包
- 服务器端也发送一个Change Cipher Spec消息,告诉客户端:接下来的消息都会使用新的主密钥和加密算法。服务器端也发送一个Finished消息给客户端。
markdown
# 服务器端Finished包
- 握手完成。编号7、8两步被称作ChangeCipherSpec协议阶段,在这两个阶段前后使用的主密钥和加密算法已经不同了。之后服务器和客户端以加密方式通信。
示例说明
以下示例中 =>
为发送消息的方向,==>
表示服务器返回的消息,示例中参考了一篇博客
- 一般的HTTPS请求流程:
```
当你在浏览器里输入https://www.baidu.com,浏览器向服务器发起链接请求,服务器返回一个证书,浏览器验证证书的合法性,如证书失效或者证书不合法等,浏览器有可能提示用户有网站冒充的风险, 此时可以选择是否继续;
你选择继续,浏览器通过证书里的加密算法和密钥来加密询问信息并传输给服务器。服务器收到询问信息后用自己的私钥解密后,并尝试对发送出去的消息做一次数字签名,并把消息和签名向浏览器发回。
浏览器会等待,直到服务器向其发送完成连接消息;浏览器再次发送一条加密请求到服务器,服务器用同样的算法和密钥进行加密运算后,发送给浏览器,浏览器再根据确认的方法对其确认,确认后,浏览器发送一条成功的链接消息给服务器,此时,HTTPS的安全链接建立成功。
浏览器和服务器就可以在这条安全的连接上进行数据交换了,所有信息的传输都是加密的,在传输过程中不会被别人窃取到或者改变。
```
-
具体一次TLS握手过程:
-
客户端发送请求
```markdown
ClientHello
s---[client hello]->e
,---- ServerHello | Certificate | ServerKeyExchange | CertificateRequest | <Private Key operation> `-- ServerHelloDone
Client Certificate
s<--[certificate+keyattestation]<-e
Client Key Exchange
s---[key exchange]->e
,-------- Certificate | ClientKeyExchange | <Private Key operation> `---[change cipher spec]--->
Change Cipher Spec
s---[change cipher spec]->e
,-- Finished | (Hash for integrity) | <Private Key operation> `---[Finished]--->
Finished
s<--[Finished(verify)]<-e
``` -
服务器发送响应
```markdown
ClientHello
ServerHello
s<--[server hello]<-e
Certificate
s<--[certificate]<-e
Server Key Exchange
s<--[key exchange]<-e
Certificate Request
s<--[certificate request]<-e
ServerHelloDone
s<--[hello done]<-e
Client Certificate
s---[certificate+keyattestation]->e
Client Key Exchange
Change Cipher Spec
s<--[change cipher spec]<-e
Finished
s---[Finished(verify)]->e
Finished
s<--[Finished(verify)]<-e
```
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于HTTPS的TSL握手 - Python技术站