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 连接

如何解决 PHP 中的 ldap_start_tls()“无法启动 TLS:连接错误”?

TLS连接

TLS连接

具有多个套接字连接的 HTTP2 和 TLS

MQTT 无法通过 TLS 连接