浅析 TLS(ECDHE)协议的握手流程(图解)

2023-10-31 14:36

本文主要是介绍浅析 TLS(ECDHE)协议的握手流程(图解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

通过 wireshark 抓取 HTTPS 包,理解 TLS 1.2 安全通信协议的握手流程。

重点理解几个点:

  1. TLS 握手流程:通过 wireshark 抓取 HTTPS 包理解。
  2. 协商加密:双方通过 ECDHE 椭圆曲线的密钥交换算法,协商出共享的 会话密钥 进行内容对称加密通信,避免传输会话密钥被中间人窃取。
  3. CA 证书:证书用来验证服务端的合法性。证书类似于身份证,可以证明某人是某人,当然身份证可以伪造,一般人可能识别不出来,但是国家相关部门可以验证你的身份合法性。同理,服务端可以通过 CA 证书识别自身身份,客户端接收服务端发送的证书,并通过 证书链 验证该证书,以此确认服务端身份。

文章来源:浅析 TLS(ECDHE)协议的握手流程(图解)


1. 概念

1.1. HTTPS

HTTPS 协议是一种基于 HTTP 协议的安全通信协议。

它通过使用 TLS/SSL 协议对通信进行加密,确保数据在传输过程中的安全性和完整性。

HTTPS 协议使用了公钥加密和对称加密的组合,可以防止第三方窃听、篡改或伪造数据。通过使用 HTTPS 协议,网站可以保护用户的隐私和敏感信息,提供更安全的网络通信环境。

文字来源:ChatGPT


1.2. SSL/TLS

SSL(Secure Sockets Layer)和 TLS(Transport Layer Security)都是为网络通信提供安全和数据完整性的加密协议。

SSL 是由网景公司在1990年代早期开发。TLS是其后续版本,由互联网工程任务组(IETF)开发。虽然两者在技术上有所不同,但它们的目标和功能基本相同,因此通常一起讨论,并且术语 “SSL/TLS” 常常被用来表示两者。

SSL/TLS 协议主要有两个目的:一是确保数据在传输过程中的隐私,二是确保数据在传输过程中的完整性。这是通过在数据传输开始时进行一次“握手”来实现的,以便服务器和客户端可以就如何加密数据进行协商,并可选地验证对方的身份。

在握手过程中,服务器和客户端会协商一个密钥,然后使用这个密钥对传输的数据进行加密和解密。这样,即使数据在传输过程中被拦截,也无法读取其内容,除非拦截者知道密钥。

此外,SSL/TLS 还可以使用数字证书来验证服务器(或在某些情况下,客户端)的身份。这是通过将服务器的公钥和一些身份信息打包到一个由受信任的第三方(称为证书颁发机构)签名的证书中来实现的。客户端可以验证证书的签名,以确保它是与服务器通信,而不是与冒充服务器的攻击者通信。

总的来说,SSL/TLS是一种重要的安全协议,用于保护网络通信不被窃听或篡改。

文字来源:ChatGPT

在这里插入图片描述

图片来源:《图解 TCP_IP》


1.3. ECDHE 算法

1.3.1. 概念

TLS 的 ECDHE 算法是一种基于椭圆曲线的密钥交换算法,全称为 Elliptic Curve Diffie-Hellman Ephemeral。

它的工作流程如下:

  1. 客户端和服务器各自选择一个 椭圆曲线私钥(随机数),并使用椭圆曲线算法生成对应的 椭圆曲线公钥
  2. 在握手阶段,客户端和服务器互相交换 椭圆曲线公钥
  3. 客户端和服务器各自使用 对方的椭圆曲线公钥自己的椭圆曲线私钥,通过椭圆曲线的点运算生成一个 共享密钥。由于椭圆曲线的数学性质,这个共享密钥在双方都知道,但是不能被第三方计算出来。(共享密钥并非通过传输手段获得,避免中间人截取。)
  4. 客户端和服务器使用这个共享密钥进行 对称加密通信

ECDHE 算法的优点是每次握手都会生成一个新的密钥,即使有人能够破解一个会话的密钥,也无法用这个密钥破解其他会话的通信,这就是所谓的前向保密性。

部分文字来源:ChatGPT


1.3.2. 简单数学原理
1.3.2.1. 点运算

椭圆曲线上有两个点:Q,P,以及整数 k;点 P 经过 k 次点运算得到点 Q。

【注意】 给定 k 和 P 很容易获得 Q;但是给定 Q 和 P,却很难得到 k(因为计算量非常大),这就是难以破解的关键。

Q = kP

详细算法请参考:宸极实验室—『CTF』深入浅出 ECC


1.3.2.2. 协商密钥原理

参考下图,client 和 server 通过椭圆曲线算法协商出来一个共享密钥。

  1. 椭圆曲线 G 点 等一些算法信息是公开的。
  2. server 生成一个随机数 b 作为私钥,通过原理 Q = kP 进行椭圆曲线点运算 B = bG,G 点经过 b 次点运算,获得 B 点,B 点作为 server 的公钥
  3. server 将椭圆曲线公钥 B 发送给 client。
  4. client 生成一个随机数 a 作为私钥,通过原理 Q = kP 进行椭圆曲线点运算 A = aG,G 点经过 a 次点运算,获得 A 点,A 点作为 client 的公钥
  5. client 将 A 点发送给 server。
  6. client 将 自己的私钥 a 和 server 发送的公钥 B 点,进行点运算获得新密钥:新密钥(点)= aB = a(bG)。
  7. server 将自己的私钥 b 和 client 发送的公钥 A 点,进行点运算获得新密钥:新密钥(点)= bA = b(aG)。
  8. 此时双方都生成了会话密钥,根据乘法交换律 a(bG) = b(aG) 推出 aB = bA = 新密钥(点),也就是说双方的新密钥是相同的,这就是协商出来的 共享密钥

在双方协商加密过程中,因为双方发送的是自己的公钥,还有 G 点等公开信息。

回顾上文 Q = kP,知道 Q 点和 P 点,计算出 k 是十分困难的。

换句话说,知道了公钥和椭圆曲线基点等公开信息,要破解出私钥 k 是非常困难的。

在这里插入图片描述


2. 工作流程

2.1. 主流程

理解了一些基本概念之后,下面我们将在浏览器访问某些 HTTPS 域名,抓包分析 TLS 的工作流程。

  1. TCP 三次握手:TLS 是应用层协议,使用传输层的 TCP 进行通信,通信双方在进行 TLS 握手前,需要先进行 TCP 三次握手建立链接。
  2. TLS 握手:通信双方通过 ECDHE 算法交换密钥,协商出一个共享的会话密钥,对传输的数据进行加密和解密。
  3. 对称加密通信:因为非对称协商加密性能损耗大,所以通信双方需要通过 TLS 握手协商出对称密钥,使用该密钥进行加密通信,既安全又高效。

2.2. TLS 握手过程

TLS 握手原理是双方互换信息,协商出共享的 会话密钥

客户端随机数 + 服务端随机数 + 预主密钥 = 主密钥 ==> 会话密钥
  • TLS 握手协议(Wireshark 抓包)。

在这里插入图片描述

  • 握手阶段。

在这里插入图片描述

  1. 协议:Client Hello,客户端发送它支持的 TLS 版本,加密套件列表,客户端随机数给服务端。

在这里插入图片描述

  1. 协议:Server Hello,服务端发送它选择的 TLS 版本,加密套件,服务端随机数给客户端。
    在这里插入图片描述

在这里插入图片描述

  1. 协议:Certificate,服务端发送 CA 证书(公钥 + 证书持有者等信息)给客户端。
    在这里插入图片描述

  2. 协议:Server Key Exchange。
    在这里插入图片描述

  3. 协议:Server Hello Done。服务端发送确认给客户端,已完成 Hello 阶段流程。
    在这里插入图片描述

  4. 协议:Client Key Exchange。客户端生成椭圆曲线公钥,并将其发送给服务端。
    在这里插入图片描述

  5. 协议:Change Cipher Spec。客户端通知服务端,确认握手过程中的加密算法和密钥已经生效,表示之后的消息都将使用新的密钥。
    在这里插入图片描述

  6. 协议:Encrypted Handshake Message。客户端将之前的握手数据(发送和接收)做一个摘要,再用会话密钥(对称密钥)加密摘要数据,将密文发送给服务端。作用:

  • 服务端解密密文以此验证双方协商出来的密钥是否一致。
  • 服务端还可以验证确认握手数据的安全性和完整性,保证不被中间人篡改。
    在这里插入图片描述
  1. 协议:New Session Ticket。服务器发送该消息给客户端,包含一个新的会话票据,用于快速恢复会话,避免重复握手。
    在这里插入图片描述

10.协议:Change Cipher Spec。服务端接收到客户端生成的椭圆曲线公钥,也协商出共享的会话秘钥,并通知客户端表示之后的消息都将使用新的密钥。
在这里插入图片描述

  1. 协议:Encrypted Handshake Message。服务端将之前的握手数据(发送和接收)做一个摘要,再用会话密钥(对称密钥)加密摘要数据,将密文发送给客户端,确认握手过程的完成。
    在这里插入图片描述

3. CA 证书

3.1. 概念

CA证书 是由权威的证书颁发机构(Certificate Authority)签发的数字证书。


3.2. 证书作用

  1. 验证网站的身份:CA证书 包含了网站的公钥和其他相关信息,由权威的证书颁发机构签发。当用户访问一个网站时,浏览器会检查网站的证书是否由可信的 CA机构 签发,以验证网站的身份是否可信。

  2. 加密通信数据:CA证书 使用了公钥加密和对称加密的组合,可以加密传输的数据。这样可以防止第三方窃听、篡改或伪造数据,确保通信的安全性和完整性。

  3. 建立信任关系:由于 CA证书 是由可信的证书颁发机构签发的,浏览器会预先内置一些受信任的CA机构的根证书。当浏览器检查到网站的证书由受信任的 CA机构 签发时,会建立起对该网站的信任关系,显示安全的锁标志。

文字来源:ChatGPT

在这里插入图片描述


3.3. 证书来源

CA 证书由权威的证书颁发机构 CA(Certificate Authority)签发,个人或公司要申请证书,可以通过相关平台付费购买或者免费申请获得。

在这里插入图片描述


3.4. 证书工作原理

3.4.1. 证书链路

在这里插入图片描述

  1. 首先证书颁发机构(CA)会颁发 根证书。
  2. 用户的计算机系统或浏览器会从 CA 获取根证书,并预装根证书。
  3. 根证书机构创建 中间证书 授权给 中间证书颁发机构 颁发 SSL证书。
  4. 个人或公司向 中间证书颁发机构 申请一个 服务器证书,中间颁发证书机构 接受申请,创建证书文件:包含 RSA公钥 的服务器证书文件和 RSA私钥 文件;有些 PERM 证书文件会将 中间证书 和 服务器证书 打包在一起。
  5. 中间颁发证书机构 创建对应的证书文件后,个人或公司可以从证书签发平台下载下来。
  6. 服务器启动服程序,并加载:服务器证书文件 和 RSA私钥。
  7. 用户通过 HTTPS 访问服务程序,进入 TLS 握手环节。
  8. 服务程序会给客户端发送 服务器证书。
  9. 客户端获得服务器证书后,通过 证书链 对该服务器证书进行校验。因为之前用户的计算机系统或浏览器已经预装了根证书,那么证书链验证:根证书验证中间证书合法,中间证书验证服务器证书合法。
  10. 客户端获得的服务器证书里包含了 RSA 的公钥,这个是公开的。RSA 私钥仍然在服务端,那么 RSA 私钥加密的数据(签名数据),公钥可以解密;反过来,RSA 公钥加密的密文,只有私钥可以解密。
  11. TLS 的握手的其它环节请参考上文。

3.4.2. 证书验证

在这里插入图片描述

  1. 首先,客户端会从服务器获取证书链。证书链通常包括服务器证书、一个或多个中间证书。
  2. 客户端首先会检查服务器证书的有效性,包括证书的有效期、证书的颁发机构等。
  3. 然后,客户端会使用 中间证书的公钥 来验证服务器证书的签名(如上图:证书签名验证)。
  4. 接着,客户端会检查中间证书的有效性,并使用根证书的公钥来验证中间证书的签名。
  5. 最后,客户端会检查根证书的有效性。由于根证书是自我签名的,所以客户端会使用根证书的公钥来验证根证书的签名。
  6. 如果所有的证书都通过了验证,那么证书链就被认为是有效的。如果任何一个证书没有通过验证,那么证书链就被认为是无效的。

部分文字来源:ChatGPT


3.5. HTTPS 服务配置

  • 例如 nginx 服务端 https 通信配置。
# /etc/nginx/vhost/blog.conf
server {listen       443 ssl; # 监听 HTTPS 443 端口。server_name  xxx.com www.xxx.com;ssl_certificate /usr/local/nginx/ssl/blog/3513736_xxx.com.pem;ssl_certificate_key /usr/local/nginx/ssl/blog/3513736_xxx.com.key;ssl_session_timeout 5m;ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_ciphers AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;ssl_prefer_server_ciphers on;
}
配置项描述
ssl_certificate指定服务器证书的路径。服务器证书是由 CA 机构签发的,用于 验证服务器的身份。它包含了服务器的公钥和其他相关信息。
ssl_certificate_key指定服务器证书的私钥的路径。私钥用于对传输的数据进行加密和解密。
ssl_session_timeout指定 SSL 会话的超时时间。SSL 会话是在客户端和服务器之间建立的安全连接,超过超时时间后会自动关闭。
ssl_protocols指定支持的 SSL/TLS 协议版本。常见的协议版本包括 SSLv2、SSLv3、TLSv1.0、TLSv1.1 和 TLSv1.2。
ssl_ciphers指定支持的加密算法和密钥长度。常见的加密算法包括 AES、DES 和 RC4,密钥长度包括 128 位和 256 位。
ssl_prefer_server_ciphers指定是否优先使用服务器端的加密算法和密钥长度。如果设置为 “on”,则服务器端的加密算法和密钥长度优先级高于客户端。

文字来源:ChatGPT


  • 使用 openssl 客户端测试某宝域名。有兴趣的朋友可以结合上文去理解下面客户端与服务端交互的详细信息。
# 源码编译 openssl 配置:
# ./config enable-ssl-trace --prefix=/Users/xxx/openssl -openssldir=/Users/xxx/openssl/build
# 客户端执行命令:
# openssl s_client -connect taobao.com:443 -state -showcerts
# 客户端打印内容:
CONNECTED(00000006)
# 握手流程
SSL_connect:before SSL initialization
SSL_connect:SSLv3/TLS write client hello
SSL_connect:SSLv3/TLS write client hello
SSL_connect:SSLv3/TLS read server hello
depth=2 C = BE, O = GlobalSign nv-sa, OU = Root CA, CN = GlobalSign Root CA
verify return:1
depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign Organization Validation CA - SHA256 - G3
verify return:1
depth=0 C = CN, ST = ZheJiang, L = HangZhou, O = "Alibaba (China) Technology Co., Ltd.", CN = taobao.com
verify return:1
SSL_connect:SSLv3/TLS read server certificate
SSL_connect:SSLv3/TLS read server key exchange
SSL_connect:SSLv3/TLS read server done
SSL_connect:SSLv3/TLS write client key exchange
SSL_connect:SSLv3/TLS write change cipher spec
SSL_connect:SSLv3/TLS write finished # Encrypted Handshake Message
SSL_connect:SSLv3/TLS write finished # Encrypted Handshake Message
SSL_connect:SSLv3/TLS read server session ticket
SSL_connect:SSLv3/TLS read change cipher spec
SSL_connect:SSLv3/TLS read finished # Encrypted Handshake Message
---
# 证书链
Certificate chain0 s:C = CN, ST = ZheJiang, L = HangZhou, O = "Alibaba (China) Technology Co., Ltd.", CN = taobao.comi:C = BE, O = GlobalSign nv-sa, CN = GlobalSign Organization Validation CA - SHA256 - G3a:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256v:NotBefore: Mar 20 04:06:03 2023 GMT; NotAfter: Apr 20 04:06:02 2024 GMT
-----BEGIN CERTIFICATE-----
MIIG3j... # 删减
-----END CERTIFICATE-----1 s:C = BE, O = GlobalSign nv-sa, CN = GlobalSign Organization Validation CA - SHA256 - G3i:C = BE, O = GlobalSign nv-sa, OU = Root CA, CN = GlobalSign Root CAa:PKEY: rsaEncryption, 2048 (bit); sigalg: RSA-SHA256v:NotBefore: Sep  4 00:00:00 2015 GMT; NotAfter: Sep  4 00:00:00 2025 GMT
-----BEGIN CERTIFICATE-----
MIIEiz... # 删减
-----END CERTIFICATE-----
---
Server certificate
subject=C = CN, ST = ZheJiang, L = HangZhou, O = "Alibaba (China) Technology Co., Ltd.", CN = taobao.com
issuer=C = BE, O = GlobalSign nv-sa, CN = GlobalSign Organization Validation CA - SHA256 - G3
---
No client certificate CA names sent
Peer signing digest: SHA256
Peer signature type: RSA-PSS
Server Temp Key: X25519, 253 bits
---
SSL handshake has read 3577 bytes and written 405 bytes
Verification: OK
---
New, TLSv1.2, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:Protocol  : TLSv1.2Cipher    : ECDHE-RSA-AES128-GCM-SHA256Session-ID: D416F803F9E5E1BA04E98CA7A23014A8B5A6459C47FA2C1E30B144B8BA756F51Session-ID-ctx: Master-Key: 095368226B46D96CAABCF5F311C398279B89E1D10A896BC34F49FDC4CC64C30BAE2310412284BE2D913D53ED1571FD9APSK identity: NonePSK identity hint: NoneSRP username: NoneTLS session ticket lifetime hint: 7200 (seconds)TLS session ticket:0000 - 60 82 b6 11 a6 b3 fb 36-5e cc a5 be b7 4a 09 db   `......6^....J..0010 - 11 2d d9 b7 46 84 21 59-95 16 a3 7a 07 3f 20 ed   .-..F.!Y...z.? .***Start Time: 1697593108Timeout   : 7200 (sec)Verify return code: 0 (ok)Extended master secret: yes
---

4. 参考

  • 《半小时漫画计算机》
  • HTTPS RSA 握手解析
  • HTTPS ECDHE 握手解析
  • TLS/1.2和TLS/1.3的核心区别 | HTTPS有哪些不安全因素
  • HTTPS是什么?加密原理和证书。SSL/TLS握手过程
  • 测试成长之根证书,怎么保障了HTTPS的安全
  • matter协议椭圆曲线密码学(ECC)原理详解
  • 【深度知识】RSA加密、解密、签名、验签的原理及方法
  • HTTPS(三):使用 ECDHE 加密算法的 TLS 握手流程
  • 宸极实验室—『CTF』深入浅出 ECC
  • 公钥加密技术ECC椭圆曲线
  • 看得到的TCP/IP: Wireshark抓包 tcp三次握手四次挥手
  • TLS1.2 PreMasterSecret And MasterSecret

这篇关于浅析 TLS(ECDHE)协议的握手流程(图解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/316043

相关文章

linux环境openssl、openssh升级流程

《linux环境openssl、openssh升级流程》该文章详细介绍了在Ubuntu22.04系统上升级OpenSSL和OpenSSH的方法,首先,升级OpenSSL的步骤包括下载最新版本、安装编译... 目录一.升级openssl1.官网下载最新版openssl2.安装编译环境3.下载后解压安装4.备份

浅析Python中的绝对导入与相对导入

《浅析Python中的绝对导入与相对导入》这篇文章主要为大家详细介绍了Python中的绝对导入与相对导入的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1 Imports快速介绍2 import语句的语法2.1 基本使用2.2 导入声明的样式3 绝对import和相对i

C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)

《C#集成DeepSeek模型实现AI私有化的流程步骤(本地部署与API调用教程)》本文主要介绍了C#集成DeepSeek模型实现AI私有化的方法,包括搭建基础环境,如安装Ollama和下载DeepS... 目录前言搭建基础环境1、安装 Ollama2、下载 DeepSeek R1 模型客户端 ChatBo

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

Linux流媒体服务器部署流程

《Linux流媒体服务器部署流程》文章详细介绍了流媒体服务器的部署步骤,包括更新系统、安装依赖组件、编译安装Nginx和RTMP模块、配置Nginx和FFmpeg,以及测试流媒体服务器的搭建... 目录流媒体服务器部署部署安装1.更新系统2.安装依赖组件3.解压4.编译安装(添加RTMP和openssl模块

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

springboot启动流程过程

《springboot启动流程过程》SpringBoot简化了Spring框架的使用,通过创建`SpringApplication`对象,判断应用类型并设置初始化器和监听器,在`run`方法中,读取配... 目录springboot启动流程springboot程序启动入口1.创建SpringApplicat

通过prometheus监控Tomcat运行状态的操作流程

《通过prometheus监控Tomcat运行状态的操作流程》文章介绍了如何安装和配置Tomcat,并使用Prometheus和TomcatExporter来监控Tomcat的运行状态,文章详细讲解了... 目录Tomcat安装配置以及prometheus监控Tomcat一. 安装并配置tomcat1、安装

MySQL的cpu使用率100%的问题排查流程

《MySQL的cpu使用率100%的问题排查流程》线上mysql服务器经常性出现cpu使用率100%的告警,因此本文整理一下排查该问题的常规流程,文中通过代码示例讲解的非常详细,对大家的学习或工作有一... 目录1. 确认CPU占用来源2. 实时分析mysql活动3. 分析慢查询与执行计划4. 检查索引与表