TLS连接
Posted vector6_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TLS连接相关的知识,希望对你有一定的参考价值。
TLS连接
在TCP三次握手后,TLS握手要经历2个RTT:
客户端:
Client Hello
- 随机数C,客户端的TLS版本号,密码套件列表,扩展列表
服务器:
Server Hello
- 随机数S,确认TLS版本号和使用的密码套件(ECDHE)
- 服务器使用的证书(Server Certificate)
- Server Key Exchange 密钥交换算法参数(ECDHE),签名认证
第二个RTT:
客户端:
- Client Key Exchange 密钥交换算法参数(ECDHE)
- Change Cipher Spec 之后改用会话密钥加密通信
- Finished 所有握手数据的摘要
- GET/HTTP/1.1 加密的HTTP消息
服务器:
- Change Cipher Spec 之后使用会话密钥加密通信
- Finished 所有握手数据的摘要
- HTTP/1.1 200 OK 加密的HTTP消息
在 TCP 建立连接之后,浏览器会首先发一个“Client Hello”消息,里面有客户端的版本号、支持的密码套件,还有一个随机数,用于后续生成会话密钥。
服务器收到“Client Hello”后,会返回一个“Server Hello”消息。把版本号对一下,也给出一个随机数,然后从客户端的列表里选一个作为本次通信使用的密码套件。然后,服务器为了证明自己的身份,就把证书也发给了客户端(Server Certificate)。接下来,在证书后发送“Server Key Exchange”消息,里面是椭圆曲线的公钥(Server Params),用来实现密钥交换算法,再加上自己的私钥签名认证。
客户端拿到服务器的证书后,开始走证书链逐级验证,确认证书的真实性,再用证书公钥验证签名,就确认了服务器的身份。然后,客户端按照密码套件的要求,也生成一个椭圆曲线的公钥(Client Params),用“Client Key Exchange”消息发给服务器。
现在客户端和服务器手里有了三个随机数:Client Random、Server Random 和 Pre-Master。用这三个作为原始材料,就可以生成用于加密会话的主密钥,叫“Master Secret”。
主密钥有 48 字节,但它也不是最终用于通信的会话密钥,还会再用 PRF 扩展出更多的密钥,比如客户端发送用的会话密钥(client_write_key)、服务器发送用的会话密钥(server_write_key)等等,避免只用一个密钥带来的安全隐患。
有了主密钥和派生的会话密钥,客户端发一个“Change Cipher Spec”,然后再发一个“Finished”消息,把之前所有发送的数据做个摘要,再加密一下,让服务器做验证。
服务器也是同样的操作,发“Change Cipher Spec”和“Finished”消息,双方都验证加密解密 OK,握手正式结束,后面就收发被加密的 HTTP 请求和响应了。
以上是关于TLS连接的主要内容,如果未能解决你的问题,请参考以下文章
如何强制 java 服务器只接受 tls 1.2 并拒绝 tls 1.0 和 tls 1.1 连接