1、基础概念
1.1 什么是SSL/TLS?
想象一下,你在网上购物、登录邮箱或者使用网上银行。你输入的密码、银行卡号和个人信息,就像是装在信封里的信件,在复杂的互联网中传递。如果没有特殊保护,任何"邮递员"(网络节点)都可以轻易地拆开信件,偷看甚至篡改你的隐私信息。
TLS (Transport Layer Security,传输层安全性协议) 就是为了解决这个问题而诞生的。它是一种加密协议,目标是在两个通信应用程序之间提供隐私和数据完整性。它的前身是 SSL (Secure Sockets Layer,安全套接层)。
🔑 核心功能
- 加密: 保护数据在传输过程中不被窃听。就像给信件上了锁,只有拥有正确钥匙的人才能打开。
- 身份验证: 确认通信双方的身份。确认你正在与之通信的对方是"真的",而不是冒名顶替的骗子。就像核对收件人的身份证一样。
- 完整性: 确保数据在传输过程中未被篡改。就像在信封上贴了防伪封条,任何改动都会被发现。
1.2 为什么需要SSL/TLS?
在没有加密的情况下,网络通信就像在明信片上写信 - 任何人都可以读取内容。SSL/TLS就像给你的信件装上了一个安全的信封。
⚠️ 没有SSL/TLS的风险
- 数据被窃听 (如密码、信用卡信息)
- 数据被篡改 (中间人攻击)
- 身份被冒充 (钓鱼网站)
2、发展历史
TLS的发展历史可以追溯到其前身SSL,经过多年的发展演变,现在主流使用的版本大多是TLS1.2和TLS1.3,旧版本存在很大安全性,逐渐被弃用。

2.1 协议比较
| 版本 | 发布年份 | 安全等级 | 握手往返次数 | 主要特性 | 当前状态 |
|---|---|---|---|---|---|
| SSL 2.0 | 1995 | 已弃用 | 2-3 | 基础加密 | 严重漏洞,禁用 |
| SSL 3.0 | 1996 | 已弃用 | 2-3 | 改进的加密 | POODLE攻击,禁用 |
| TLS 1.0 | 1999 | 逐步淘汰 | 2-3 | 标准化 | 2020年后不建议使用 |
| TLS 1.1 | 2006 | 逐步淘汰 | 2-3 | 修复CBC攻击 | 2020年后不建议使用 |
| TLS 1.2 | 2008 | 推荐 | 2-3 | 强加密算法 | 当前主流 |
| TLS 1.3 | 2018 | 最佳 | 1-2 | 0-RTT,完美前向保密 | 未来标准 |
3、TLS协议架构详解
tls是标准的协议,由RFC制定维护。
3.1 TLS在协议栈中的位置

- 位置: 介于应用层和传输层之间
- 透明性: 对应用层透明,应用无需修改即可获得安全性
- 依赖性: 依赖TCP提供可靠传输
- 服务性: 为上层应用提供安全传输服务
3.2 TLS协议组件
TLS协议采用分层设计,底层是TLS记录协议,上层包含四个子协议

3.2.1 TLS记录协议
TLS记录协议是TLS的底层协议,负责使用对称密码对消息进行加密,为上层协议提供安全的传输通道。
3.2.1.1 主要功能
🔐 对称加密
- 使用协商的对称密钥
- AES、ChaCha20等算法
- 保证数据机密性
✅ 完整性保护
- MAC或AEAD验证
- 防止数据篡改
- 检测传输错误
📦 数据封装
- 添加TLS记录头部
- 分片大数据块
- 序列号防重放
🔄 透明传输
- 对上层协议透明
- 统一的安全接口
- 可靠的数据传输
3.2.1.2 TLS记录协议数据处理流程
| 层级 | 字段 (Field) | 抓包中的值 (Value from Capture) | 更详细的解释 |
|---|---|---|---|
| 记录层 (Record Layer) | Content Type |
Handshake (22) |
作用 **: 标识该记录层帧内部承载的数据类型。****<font style="color:rgb(44, 62, 80);">22</font>****代表这是一个握手协议消息,与Client Hello保持一致。** |
Version |
TLS 1.2 (0x0303) |
作用**: 记录层协议版本。此处使用TLS 1.2,表明服务器确认使用此版本进行通信,这是经过协商后的最终版本。** | |
Length |
84 |
作用**: 指明紧随其后的握手协议消息的总长度(单位:字节)。比Client Hello的262字节要小很多,因为服务器只需要做出选择而不是提供选项列表。** | |
| 握手协议 (Handshake Protocol) | Handshake Type |
Server Hello (2) |
作用 **: 明确握手消息的类型。****<font style="color:rgb(44, 62, 80);">2</font>****代表这是握手过程的第二步:服务器问候(Server Hello),是对Client Hello的响应。** |
Length |
80 |
作用 **: 指明****<font style="color:rgb(44, 62, 80);">Server Hello</font>****消息体本身的长度。** |
|
Version |
TLS 1.2 (0x0303) |
作用 **: 服务器最终选择的TLS协议版本。这是服务器根据Client Hello中提议的版本和自身支持情况做出的决定,将用于后续的所有通信。** | |
Random |
06bca23121cdfd6c... |
作用 **: 服务器生成的32字节随机数,包含4字节时间戳(GMT Unix Time: Aug 1, 1973)和28字节随机数。与客户端随机数一起,构成后续生成对称会话密钥的关键材料。注意: 显示的时间戳异常(1973年)可能表明服务器故意使用随机值而非真实时间。** | |
Session ID Length |
0 |
作用 **: 服务器返回的会话ID长度。****<font style="color:rgb(44, 62, 80);">0</font>****表示服务器选择不使用传统的会话恢复机制,客户端下次连接时需要进行完整握手。** |
|
Cipher Suite |
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 (0xc02c) |
作用 **: 服务器从Client Hello提供的108个加密套件中最终选择 的一个。此套件使用:• ECDHE : 椭圆曲线迪菲-赫尔曼密钥交换(提供前向保密性)• ECDSA : 椭圆曲线数字签名算法(用于身份验证)• AES_256_GCM : 256位AES加密,GCM模式(提供加密和认证)• SHA384: 384位SHA哈希算法(用于完整性校验)** | |
Compression Method |
null (0) |
作用 **: 服务器选择的压缩方法。选择****<font style="color:rgb(44, 62, 80);">null</font>****表示不使用压缩,这是现代TLS的标准做法,避免CRIME等压缩相关攻击。** |
|
Extensions Length |
40 |
作用**: 所有扩展字段的总长度。** | |
| 扩展 (Extensions) | renegotiation_info |
Length: 1, extension length: 0 |
作用**: 重新协商信息扩展,用于防止重新协商攻击。长度为0表示这是初始握手,没有之前的协商信息。** |
server_name |
Length: 0 |
作用**: 服务器名称指示响应。长度为0表示服务器确认了客户端的SNI请求,但没有额外信息需要返回。** | |
ec_point_formats |
Length: 4, formats: uncompressed(0), ansiX962_compressed_prime(1), ansiX962_compressed_char2(2) |
作用 **: 服务器支持的椭圆曲线点格式。返回3种格式表明服务器的兼容性较好,但实际通信中通常使用****<font style="color:rgb(44, 62, 80);">uncompressed</font>****格式。** |
|
session_ticket |
Length: 0, Ticket: <MISSING> |
作用**: 会话票证扩展。长度为0且票证缺失,表明服务器支持会话票证机制,但在这次握手中没有提供新的票证(可能在后续的NewSessionTicket消息中提供)。** | |
status_request |
Length: 0 |
作用**: OCSP装订扩展。服务器确认支持OCSP装订功能,可以在握手过程中直接提供证书吊销状态信息,无需客户端单独查询OCSP服务器。** | |
application_layer_protocol_negotiation (ALPN) |
Length: 11, Protocol: http/1.1 |
作用 **: 应用层协议协商结果。服务器从Client Hello提供的协议列表(h2, http/1.1)中选择了****<font style="color:rgb(44, 62, 80);">http/1.1</font>****,表明后续的应用层通信将使用HTTP/1.1协议而非HTTP/2。** |
|
| 指纹信息 | JA3S Fullstring |
771,49196,65281-0-11-35-5-16 |
作用**: JA3S是Server Hello的指纹,用于识别服务器的TLS实现。格式为:TLS版本,选择的加密套件,扩展列表。** |
JA3S Hash |
42ec7b1db61428bf1cc6e01b9ef02b04 |
作用**: JA3S字符串的MD5哈希值,用于快速比较和识别服务器特征。** |

处理步骤说明
- 分片: 将数据分割为最大16KB的片段
- 压缩: 可选步骤,TLS 1.3已移除
- MAC计算: 使用HMAC或AEAD模式验证完整性
- 加密: 使用AES-GCM、ChaCha20-Poly1305等算法
- 添加头部: 5字节TLS记录头(类型+版本+长度)
所有流经TLS的数据,都会被该协议格式化为一个个被称为"记录 (Record)"的标准单元,然后才被发送到网络上。
3.2.1.3 TLS记录格式
每个记录由以下部分组成:

`内容类型 (Content Type)
`占1字节,用于指明记录中承载的数据属于哪个高层协议。主要有以下几种类型:
| 值 (十六进制) | 值 (十进制) | 协议 | 描述 |
|---|---|---|---|
0x14 |
20 |
Change Cipher Spec | 更改密码规范协议的消息,用于通知加密参数变更。 |
0x15 |
21 |
Alert | 警报协议的消息,用于传递错误或状态信息。 |
0x16 |
22 |
Handshake | 握手协议的消息,用于连接建立时的协商。 |
0x17 |
23 |
Application Data | 应用数据,即上层应用(如HTTP)的实际业务数据。 |
传统版本 (Version)
占2字节,用于声明协议版本。但为了兼容性,这个字段的行为有些"迷惑性"。
| 值 (十六进制) | 协议版本 | 说明 |
|---|---|---|
0x0300 |
SSL 3.0 |
已废弃,极不安全。 |
0x0301 |
TLS 1.0 |
已废弃,不安全。 |
0x0302 |
TLS 1.1 |
已废弃,不安全。 |
0x0303 |
TLS 1.2 |
目前广泛使用的主力版本。 |
0x0304 |
TLS 1.3 |
最新、最安全的版本。 |
兼容性的艺术:为了防止一些老旧的网络设备(中间件)看到不认识的高版本号(如 0x0304)就直接丢弃数据包,TLS协议规定,记录层的这个版本号可以"撒谎"。即使在进行TLS 1.3的通信,记录层的版本号也常常被设置为 0x0303(TLS 1.2) 甚至 0x0301。真正权威的、双方确认使用的协议版本,是在握手协议的 ClientHello和 ServerHello 消息中进行协商和确定的,并且该协商过程本身是受密码学保护的。
长度 (Length)
占2字节,指明了后面"加密数据"的长度,最大约为16KB。
加密数据 (Encrypted Record)
这是记录的核心部分,也是安全魔法发生的地方。它本身不是一个整体,而是由 AEAD加密算法生成的密文和认证标签的组合。
3.2.1.4 记录协议的核心机制
记录分片与重组
上层应用(如浏览器)可能会一次性向TLS层传递一个很大的数据块(比如一张高清图片)。记录协议会将其切分成多个较小的片段(通常不超过16KB)。这样做有几个好处:
- **减少延迟:**发送方不必等整个大块数据都处理完才开始发送,可以"边处理边发送",接收方也可以"边接收边解密",提高了响应速度。
- **内存效率:**处理小数据块所需的内存缓冲区更小。
- **避免丢包问题:**如果一个大的数据块在传输中丢失,TCP需要重传整个大数据块。而切分成小记录后,只需重传丢失的小记录即可。
在接收端,记录协议负责将这些分片的记录按照正确的顺序重组起来,还原成原始的上层数据。
序列号与重放攻击防护
TLS为每一个记录都维护一个隐式的序列号(或称为记录号)。这个序列号从0开始,每发送一个记录就加1。虽然这个序列号不直接出现在记录的明文头部,但它是一个至关重要的输入:
- 在AEAD加密中,这个序列号是生成Nonce(一次性随机数)的关键部分。由于每个记录的Nonce都必须是唯一的,使用递增的序列号可以完美地保证这一点。
- 接收方同样会维护一个期望收到的序列号。如果收到的记录解密后发现其序列号小于期望值,或者序列号重复,就会判定这是一次重放攻击并立即丢弃该记录,同时发出警报。
通过这种机制,攻击者即使截获了合法的加密数据包,也无法通过简单地重新发送它来达到欺骗的目的。
AEAD 加密:从明文到安全记录
TLS 1.3 强制使用 AEAD (Authenticated Encryption with Associated Data,带关联数据的认证加密)算法。它非常巧妙,能在一次计算中同时完成加密和完整性保护。

什么是"关联数据 (Associated Data)"?
这是AEAD中的一个绝妙设计。可以看到,记录的头部(类型、版本、长度)本身是不加密的,否则接收方就不知道如何处理这个数据包了。但如果攻击者篡改了头部(比如改了长度),就可能导致严重问题。
"关联数据"就是解决这个问题的。我们将这个未加密的头部作为"关联数据"输入到AEAD算法中。算法在生成认证标签时,会把这部分数据也计算进去。这样一来:
- 数据本身被加密,保证了机密性。
- 数据+头部被一起认证,保证了完整性。
接收方在解密时,会用完全相同的方式进行验证。如果头部或加密数据有任何一比特被篡改,计算出的认证标签就会不匹配,解密就会失败,从而确保了通信的绝对安全。
3.2.2 上层协议
如果说记录协议是TLS的"基础设施",那么上层协议就是运行在这个基础设施上的"专业服务团队",每个协议都有自己的专门职责。
3.2.2.1 握手协议
握手协议就像两个陌生人初次见面时的完整介绍过程:自我介绍、出示身份证、交换联系方式、约定暗号等。
主要功能
🤝 身份认证
验证服务器身份
可选的客户端认证
通过数字证书实现
🔑 密钥协商
安全地交换密钥材料
生成会话密钥
使用非对称加密保护
⚙️ 参数协商
选择加密算法
确定TLS版本
从双方支持的选项中选择
✅ 完整性验证
确认握手过程完整
防止篡改攻击
通过Finished消息实现
握手过程





握手过程中的密钥生成

握手协议的安全考虑
🛡️ 防重放攻击
机制:随机数
原理:每次握手使用不同的随机数
确保握手消息的唯一性
🔒 防篡改攻击
机制:Finished消息
原理:包含所有握手消息的哈希
任何篡改都会被检测到
🎭 防中间人攻击
机制:证书验证
原理:验证服务器身份
确保连接到正确的服务器
⚡ 防降级攻击
机制:签名验证
原理:验证协商参数的完整性
防止攻击者强制使用弱算法
TLS1.3握手协议和TLS1.2对比
TLS 1.3对握手协议进行了革命性的改进,让它更安全、更快速。

握手协议的性能优化技巧

3.2.2.2 警报协议
警报协议就像系统的"通讯员",负责在出现问题时及时通知对方,或者在正常结束时礼貌地告别。
警告级别分类
⚠️ 警告级别 (Warning)
- close_notify: 正常关闭连接
- no_certificate: 客户端没有证书
- bad_certificate: 证书有问题但可继续
**处理方式:**连接可以继续,但需要注意
🚨 致命级别 (Fatal)
- handshake_failure: 握手失败
- bad_record_mac: MAC验证失败
- decrypt_error: 解密错误
- protocol_version: 协议版本不支持
**处理方式:**立即终止连接
3.2.2.3 密码规格变更协议
就像军队换岗时的"换岗令",通知对方:"从现在开始,我们使用新的密码和规则进行通信!"
协议特点
- **简单明确:**只有一种消息类型,内容就是一个字节的"1"
- **关键时刻:**在握手完成前发送,标志着安全参数的切换
- **同步机制:**确保双方同时切换到新的加密状态
- **TLS 1.3变化:**在TLS 1.3中被移除,功能集成到握手协议中
3.2.2.4 应用数据协议
应用数据协议就像邮政系统中的"包裹投递服务",负责将用户的实际内容安全地送达目的地。

3.2.3 完整协议流程

4、加密套件详解
加密套件就像一套完整的安全防护装备,包括门锁(密钥交换)、身份证(认证)、保险箱(加密)和封条(完整性保护)。每个组件都有特定的作用,组合在一起提供全方位的安全保护。
加密套件(Cipher Suite)是TLS协议的核心组成部分,它定义了在安全通信中使用的具体加密算法组合。
密码套件地址:https://ciphersuite.info/cs
4.1 加密套件基本结构
一个完整的TLS加密套件通常包含四个核心组件,每个组件负责安全通信的不同方面:

🔑 密钥交换算法
ECDHE - 椭圆曲线Diffie-Hellman临时密钥交换
负责安全地协商会话密钥,支持前向安全性
🛡️ 身份认证算法
RSA - RSA数字签名算法
用于验证服务器身份,确保连接到正确的服务器
🔐 对称加密算法
AES_256_GCM - 256位AES加密,GCM模式
负责实际数据的加密和解密,保护数据机密性
✅ 消息认证算法
SHA384 - 384位SHA哈希算法
确保数据完整性,检测数据是否被篡改
4.2 加密套件的命名规则
TLS_密钥交换 认证 WITH 加密算法 MAC算法
TLS 1.2及之前的命名示例:
- TLS_RSA_WITH_AES_128_CBC_SHA
- TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
TLS 1.3的简化命名:
- TLS_AES_128_GCM_SHA256
- TLS_AES_256_GCM_SHA384
- TLS_CHACHA20_POLY1305_SHA256
- TLS_AES_128_CCM_SHA256
TLS 1.3简化了命名,因为密钥交换和认证算法在握手中单独协商
4.3 加密套件的协商过程
客户端和服务器如何选择最合适的加密套件是一个重要的安全过程:

4.4 秘钥交换算法
密钥交换算法是加密套件的第一个组件,负责在不安全的网络上安全地协商共享密钥。
主要密钥交换算法对比
| 算法 | 全称 | 原理 | 密钥长度 | 前向安全 | 性能 | 安全状态 |
|---|---|---|---|---|---|---|
| RSA | Rivest-Shamir-Adleman | 客户端生成随机密钥,用服务器公钥加密后发送 | 1024-4096位 | ❌ 不支持 | 慢 | ⚠️ 不推荐 |
| DHE | Diffie-Hellman Ephemeral | 双方各自生成私钥,交换公钥,计算出相同的共享密钥 | 1024-4096位 | ✅ 支持 | 慢 | ⚠️ 条件使用 |
| ECDHE | Elliptic Curve DHE | 在椭圆曲线上进行DH密钥交换 | 256-521位 | ✅ 支持 | 快 | ✅ 推荐 |
4.4.1 RSA密钥交换 - 传统但有缺陷
**⚠️ 安全警告:**RSA密钥交换不支持前向安全性,现代应用不应使用。
工作原理:
1. 客户端生成预主密钥
生成48字节的随机数作为Pre-Master Secret
2. 使用服务器公钥加密
用服务器证书中的RSA公钥加密预主密钥
3. 发送给服务器
在Client Key Exchange消息中发送加密的预主密钥
4. 服务器解密
服务器使用私钥解密得到预主密钥
❌ 主要缺陷:
- **无前向安全性:**如果服务器私钥泄露,所有历史会话都可被解密
- **性能较差:**RSA解密操作计算量大
- **密钥长度要求高:**需要至少2048位密钥才相对安全
4.4.2 DHE密钥交换 - 支持前向安全
**💡 核心优势:**DHE支持前向安全性,即使服务器私钥泄露,历史会话仍然安全。
Diffie-Hellman密钥交换原理:

⚠️ DHE的挑战:
- **性能开销:**大整数模幂运算计算量大
- **参数选择:**需要安全的素数p和生成元g
- **密钥长度:**需要至少2048位才安全,推荐3072位
- **实现复杂:**容易出现实现漏洞
4.4.3 ECDHE密钥交换 - 现代首选
**🚀 最佳选择:**ECDHE结合了前向安全性和高性能,是现代TLS的首选密钥交换算法。
椭圆曲线Diffie-Hellman原理:
数学基础:
- **椭圆曲线:**y² = x³ + ax + b
- **点运算:**椭圆曲线上的点加法
- **标量乘法:**k·P = P + P + ... + P (k次)
- **离散对数难题:**已知k·P和P,求k很困难
常用曲线:
- **P-256 (secp256r1):**NIST标准,广泛支持
- **P-384 (secp384r1):**更高安全性
- **P-521 (secp521r1):**最高安全性
- **X25519:**高性能,抗侧信道攻击
ECDHE密钥交换示例:
-
双方选择相同的椭圆曲线E和基点G
-
客户端:选择私钥a,计算公钥A = a·G
-
服务器:选择私钥b,计算公钥B = b·G
-
交换公钥A和B
-
共享密钥:K = a·B = b·A = ab·G
✅ ECDHE的优势:
- **高性能:**256位ECC相当于3072位RSA的安全性
- **前向安全:**每次握手使用新的临时密钥对
- **硬件友好:**现代CPU有专门的ECC指令
- **带宽效率:**密钥和签名尺寸小
4.5 身份认证算法
身份认证算法用于验证通信对方的身份,通常通过数字签名实现。
主要身份认证算法
| 算法 | 密钥长度 | 签名长度 | 性能 | 安全性 | 推荐度 |
|---|---|---|---|---|---|
| RSA | 2048-4096位 | 256-512字节 | 中等 | 高 | ✅ 广泛支持 |
| ECDSA | 256-521位 | 64-132字节 | 高 | 高 | ✅ 推荐 |
| EdDSA | 255-448位 | 64-114字节 | 很高 | 很高 | 🚀 未来趋势 |
| DSA | 1024-3072位 | 40-96字节 | 低 | 中 | ❌ 已废弃 |
4.6 对称加密算法
对称加密算法负责实际数据的加密和解密,是保护数据机密性的核心。
主要对称加密算法对比
| 算法 | 密钥长度 | 分组大小 | 模式 | 性能 | 安全性 | 状态 |
|---|---|---|---|---|---|---|
| AES-128 | 128位 | 128位 | CBC/GCM/CCM | 很高 | 高 | ✅ 推荐 |
| AES-256 | 256位 | 128位 | CBC/GCM/CCM | 高 | 很高 | ✅ 推荐 |
| ChaCha20 | 256位 | 流密码 | Poly1305 | 很高 | 很高 | ✅ 推荐 |
| 3DES | 168位 | 64位 | CBC | 低 | 低 | ❌ 已废弃 |
| RC4 | 40-2048位 | 流密码 | - | 高 | 很低 | ❌ 已禁用 |
4.6.1 AES
AES算法特点:
技术规格:
分组大小:128位固定
密钥长度:128/192/256位
轮数:10/12/14轮
结构:替换-置换网络(SPN)
性能优势:
硬件加速:AES-NI指令集支持
并行处理:支持并行加密
内存效率:查找表优化
广泛支持:所有现代平台
AES工作模式对比:
CBC模式
优点:简单,广泛支持
缺点:不能并行,需要填充
安全:需要随机IV
用途:传统TLS应用
GCM模式
优点:AEAD,高性能,并行
缺点:IV重用致命
安全:内置认证
用途:现代TLS首选
CCM模式
优点:AEAD,简单实现
缺点:不能并行加密
安全:内置认证
用途:资源受限环境
4.6.2 ChaCha20-Poly1305
ChaCha20流密码特点:
🚀 技术优势:
软件友好:纯软件实现高效
抗侧信道:常数时间实现
简单安全:设计简洁,分析充分
移动优化:ARM处理器性能优异
📊 性能对比:
无AES-NI:比AES快2-3倍
有AES-NI:性能相当
移动设备:明显优于AES
IoT设备:资源消耗更少
ChaCha20算法核心:
- 20轮的ARX操作(加法、旋转、异或)
- 256位密钥 + 96位nonce + 32位计数器
- 每次生成64字节的密钥流
- Poly1305提供128位的消息认证码 Poly1305认证:
- 基于130位素数的多项式求值
- 一次性密钥,不可重用
-
- 128位认证标签
-
- 与ChaCha20完美配合
4.7 消息认证算法
消息认证码(MAC Message Authentication Code)算法确保数据的完整性和真实性,防止数据在传输过程中被篡改。
主要MAC算法对比
| 算法 | 输出长度 | 基础算法 | 性能 | 安全性 | 状态 |
|---|---|---|---|---|---|
| MD5 | 128位 | MD5哈希 | 高 | 很低 | ❌ 已禁用 |
| SHA-1 | 160位 | SHA-1哈希 | 高 | 低 | ⚠️ 已废弃 |
| SHA-256 | 256位 | SHA-256哈希 | 中等 | 高 | ✅ 推荐 |
| SHA-384 | 384位 | SHA-384哈希 | 中等 | 很高 | ✅ 推荐 |
| AEAD | 128位 | 集成在加密中 | 很高 | 很高 | 🚀 首选 |
4.8 加密套件的安全性
不同的加密套件组合提供不同级别的安全保护。
4.8.1 安全等级评判标准
主要根据以下几个关键指标来评判一个加密套件的安全性,其中最重要的是否支持"前向保密"。
⭐ 前向保密 (Perfect Forward Secrecy - PFS)
这是最重要的评判标准。PFS 确保即使服务器的长期私钥(如 RSA 私钥)被泄露,攻击者也无法解密过去截获的通信流量。它通过使用临时的、一次性的密钥交换算法(如 ECDHE 或 DHE)来实现。不支持 PFS 的加密套件(如仅使用 RSA 进行密钥交换)被认为是存在严重安全隐患的。
加密算法的强度和模式
现代推荐的算法是 AES ,其次是 ChaCha20 。更重要的是其工作模式,GCM 和 CCM 是现代的 AEAD(认证加密)模式,它们同时提供了加密和完整性保护,比老的 CBC 模式更安全、更高效。密钥长度方面,128 位已足够安全,256 位则提供更高保障。
哈希算法的安全性
用于消息认证的哈希算法必须是安全的。SHA-2 家族(如 SHA256, SHA384)是当前的标准。老的 MD5 和 SHA-1 算法已被证明存在严重漏洞,应完全禁用。
4.8.2 安全等级分类
加密套件安全级别分成下面4个类型
| 安全级别 | 特点 | 示例 |
|---|---|---|
| 最高安全级别(Recommended) | 前向安全 + AEAD加密 + 强哈希算法 | TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 ECDHE ECDSA AES_256_GCM SHA384 |
| 安全级别(Secure) | 前向安全 + 传统加密模式 + 安全哈希 | TLS_ECDHE_PSK_WITH_AES_128_CCM_SHA256 ECDHE PSK AES_128_CCM SHA256 |
| 低安全级别(Insecure) | 无前向安全 + 强加密算法 + 强哈希算法 | TLS_DH_anon_WITH_AES_128_CBC_SHA DH anno AES_128_CBC SHA |
| 弱安全级别(Weak) | 无前向安全 + 弱加密算法 + 弱哈希算法 | TLS_RSA_WITH_AES_128_CBC_SHA RSA RSA AES_128_CBC SHA1 |
4.8.3 TLS1.3 加密套件革新
TLS 1.3对加密套件进行了重大简化和安全性提升,移除了所有不安全的算法。
常见的TLS1.3加密套件:
TLS_AES_128_GCM_SHA256
**加密:**AES-128-GCM
**哈希:**SHA-256
**用途:**标准安全级别
**性能:**高效,广泛支持
TLS_AES_256_GCM_SHA384
**加密:**AES-256-GCM
**哈希:**SHA-384
**用途:**高安全级别
**性能:**稍慢但更安全
TLS_CHACHA20_POLY1305_SHA256
**加密:**ChaCha20-Poly1305
**哈希:**SHA-256
**用途:**移动设备优化
**性能:**软件实现高效
TLS_AES_128_CCM_SHA256
**加密:**AES-128-CCM
**哈希:**SHA-256
**用途:**资源受限环境
**性能:**内存使用少
TLS 1.3的重大改进:
- 简化命名:只包含对称加密和哈希算法
- 强制AEAD:所有套件都使用认证加密
- 移除弱算法:彻底移除CBC、RC4、MD5、SHA-1等
- 独立协商:密钥交换和签名算法单独协商
- 前向安全:所有密钥交换都支持前向安全性
5、 数字证书
在之前的讨论中,我们知道客户端需要用服务器的"公钥"来加密握手信息。但问题是,客户端如何确定这个公钥确实是目标服务器的,而不是中间人攻击者伪造的呢?数字证书就是解决这个问题的关键。
数字证书就像一个网站的"在线护照"。这本护照由一个全球公认的权威机构------证书颁发机构 (Certificate Authority, CA) 来签发。
- 护照上有你的照片和个人信息(网站的公钥和域名信息)。
- 护照上有签发机关的官方印章和防伪标识(CA 的数字签名)。
当你向别人出示护照时,对方可以通过检验印章的真伪,来确认这本护照是合法的,从而信任护照上的照片和信息确实属于你
5.1 数字证书作用
📜 证书的本质:
- **数字身份证:**证明网络实体的身份
- **公钥载体:**安全地分发公钥
- **信任桥梁:**建立信任关系
- **标准格式:**遵循X.509国际标准
🔐 证书的作用:
- **身份验证:**确认服务器身份
- **密钥分发:**安全传递公钥
- **完整性保护:**防止公钥被篡改
- **信任传递:**通过CA建立信任链
5.2 证书与PKI体系
PKI(Public Key Infrastructure)公钥基础设施。

5.3 X.509证书结构
X.509是数字证书的国际标准,定义了证书的格式和内容。它就像一张标准化的信息表,包含了以下关键字段:
Version (版本)
v1(0), v2(1), v3(2)
Serial Number (序列号)
CA内唯一标识
Signature Algorithm (签名算法)
如: sha256WithRSAEncryption
Issuer (颁发者)
CA的Distinguished Name
Validity (有效期)
Not Before / Not After
Subject (主体)
证书持有者信息
Subject Public Key Info
公钥算法和公钥值
Extensions (扩展)
v3新增的扩展字段
5.3.1 示例
我们以解析example.com证书为例,看下证书的内容。
获取证书
我们直接在浏览器上访问example.com,然后下载证书
点击域名旁边的按钮 点击连接安全,点击证书有效,查看证书

选择详细信息,导出证书

使用openssl解析证书内容
证书下载完成,我们保存到一个目录里,然后查看证书信息
bash
openssl x509 -in _.example.com -text
结果如下:
plain
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
0a:d8:93:ba:fa:68:b0:b7:fb:7a:40:4f:06:ec:af:9a
Signature Algorithm: ecdsa-with-SHA384
Issuer: C=US, O=DigiCert Inc, CN=DigiCert Global G3 TLS ECC SHA384 2020 CA1
Validity
Not Before: Jan 15 00:00:00 2025 GMT
Not After : Jan 15 23:59:59 2026 GMT
Subject: C=US, ST=California, L=Los Angeles, O=Internet Corporation for Assigned Names and Numbers, CN=*.example.com
Subject Public Key Info:
Public Key Algorithm: id-ecPublicKey
Public-Key: (256 bit)
pub:
04:9a:48:97:84:2d:61:6c:08:c9:6a:14:a0:c8:38:
80:e6:00:c0:87:fa:99:57:0e:1b:00:e2:d8:87:92:
57:e7:08:fb:3c:5e:b0:d3:84:28:37:c1:24:11:8e:
d3:20:71:74:bd:93:8f:4e:09:03:ce:02:3b:b0:e4:
66:73:cf:af:ee
ASN1 OID: prime256v1
NIST CURVE: P-256
X509v3 extensions:
X509v3 Authority Key Identifier:
keyid:8A:23:EB:9E:6B:D7:F9:37:5D:F9:6D:21:39:76:9A:A1:67:DE:10:A8
X509v3 Subject Key Identifier:
F0:C1:6A:32:0D:EC:DA:C7:EA:8F:CD:0D:6D:19:12:59:D1:BE:72:ED
X509v3 Subject Alternative Name:
DNS:*.example.com, DNS:example.com
X509v3 Certificate Policies:
Policy: 2.23.140.1.2.2
CPS: http://www.digicert.com/CPS
X509v3 Key Usage: critical
Digital Signature, Key Agreement
X509v3 Extended Key Usage:
TLS Web Server Authentication, TLS Web Client Authentication
X509v3 CRL Distribution Points:
Full Name:
URI:http://crl3.digicert.com/DigiCertGlobalG3TLSECCSHA3842020CA1-2.crl
Full Name:
URI:http://crl4.digicert.com/DigiCertGlobalG3TLSECCSHA3842020CA1-2.crl
Authority Information Access:
OCSP - URI:http://ocsp.digicert.com
CA Issuers - URI:http://cacerts.digicert.com/DigiCertGlobalG3TLSECCSHA3842020CA1-2.crt
X509v3 Basic Constraints: critical
CA:FALSE
CT Precertificate SCTs:
Signed Certificate Timestamp:
Version : v1(0)
Log ID : 0E:57:94:BC:F3:AE:A9:3E:33:1B:2C:99:07:B3:F7:90:
DF:9B:C2:3D:71:32:25:DD:21:A9:25:AC:61:C5:4E:21
Timestamp : Jan 15 01:01:25.319 2025 GMT
Extensions: none
Signature : ecdsa-with-SHA256
30:43:02:1F:24:17:0F:5A:4C:7C:D2:29:3B:B8:B6:16:
E8:E1:AF:35:8B:C9:E0:D9:8E:47:64:57:73:DB:AF:88:
53:C7:E9:02:20:52:DB:AE:51:E9:C7:21:3E:54:35:62:
5F:7C:10:51:AB:7D:6D:50:68:BB:64:34:D2:AE:B3:34:
7F:8C:F5:55:AE
Signed Certificate Timestamp:
Version : v1(0)
Log ID : 64:11:C4:6C:A4:12:EC:A7:89:1C:A2:02:2E:00:BC:AB:
4F:28:07:D4:1E:35:27:AB:EA:FE:D5:03:C9:7D:CD:F0
Timestamp : Jan 15 01:01:25.381 2025 GMT
Extensions: none
Signature : ecdsa-with-SHA256
30:44:02:20:70:AE:E8:D8:07:85:5D:50:BE:27:FF:1B:
B0:47:AB:B7:22:30:61:FC:8D:D7:21:FF:1C:B8:2F:3A:
D8:95:EB:17:02:20:72:30:53:2F:0E:11:A0:E2:C6:26:
D4:CB:2B:0C:65:5E:75:CC:29:13:87:8D:D1:1B:99:70:
51:A6:5B:1C:09:72
Signed Certificate Timestamp:
Version : v1(0)
Log ID : 49:9C:9B:69:DE:1D:7C:EC:FC:36:DE:CD:87:64:A6:B8:
5B:AF:0A:87:80:19:D1:55:52:FB:E9:EB:29:DD:F8:C3
Timestamp : Jan 15 01:01:25.401 2025 GMT
Extensions: none
Signature : ecdsa-with-SHA256
30:45:02:20:68:58:7A:EF:21:10:DA:5C:20:9B:75:F5:
EA:7D:A2:5A:31:10:14:82:36:6F:67:E9:38:DB:41:56:
26:D9:55:6C:02:21:00:F9:A6:CA:A3:5C:36:2C:20:46:
F5:87:28:74:4B:C6:C1:37:73:B8:BB:6B:00:F7:38:AC:
28:89:58:8D:98:3C:C2
Signature Algorithm: ecdsa-with-SHA384
30:65:02:31:00:f9:a6:82:46:53:db:6f:e5:58:fa:ee:1a:bc:
fc:9a:1b:b7:ef:50:32:6a:37:c2:b0:96:b5:c3:e1:7a:6d:4f:
b4:0b:f8:3d:37:f8:10:3f:15:41:28:dd:d0:f5:8b:3d:fb:02:
30:64:63:78:e1:b2:e2:c0:5b:ba:56:b0:36:ed:5f:f4:30:c6:
9e:a4:36:c2:b8:8e:1d:7f:46:3b:d5:ff:6e:b4:b3:14:30:33:
f1:8c:ee:dd:3e:4f:4b:8f:d8:bf:98:d7:65
-----BEGIN CERTIFICATE-----
MIIFmzCCBSGgAwIBAgIQCtiTuvposLf7ekBPBuyvmjAKBggqhkjOPQQDAzBZMQsw
CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMTMwMQYDVQQDEypEaWdp
Q2VydCBHbG9iYWwgRzMgVExTIEVDQyBTSEEzODQgMjAyMCBDQTEwHhcNMjUwMTE1
MDAwMDAwWhcNMjYwMTE1MjM1OTU5WjCBjjELMAkGA1UEBhMCVVMxEzARBgNVBAgT
CkNhbGlmb3JuaWExFDASBgNVBAcTC0xvcyBBbmdlbGVzMTwwOgYDVQQKEzNJbnRl
cm5ldCBDb3Jwb3JhdGlvbiBmb3IgQXNzaWduZWQgTmFtZXMgYW5kIE51bWJlcnMx
FjAUBgNVBAMMDSouZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNC
AASaSJeELWFsCMlqFKDIOIDmAMCH+plXDhsA4tiHklfnCPs8XrDThCg3wSQRjtMg
cXS9k49OCQPOAjuw5GZzz6/uo4IDkzCCA48wHwYDVR0jBBgwFoAUiiPrnmvX+Tdd
+W0hOXaaoWfeEKgwHQYDVR0OBBYEFPDBajIN7NrH6o/NDW0ZElnRvnLtMCUGA1Ud
EQQeMByCDSouZXhhbXBsZS5jb22CC2V4YW1wbGUuY29tMD4GA1UdIAQ3MDUwMwYG
Z4EMAQICMCkwJwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQ
UzAOBgNVHQ8BAf8EBAMCA4gwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMC
MIGfBgNVHR8EgZcwgZQwSKBGoESGQmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9E
aWdpQ2VydEdsb2JhbEczVExTRUNDU0hBMzg0MjAyMENBMS0yLmNybDBIoEagRIZC
aHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsRzNUTFNFQ0NT
SEEzODQyMDIwQ0ExLTIuY3JsMIGHBggrBgEFBQcBAQR7MHkwJAYIKwYBBQUHMAGG
GGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBRBggrBgEFBQcwAoZFaHR0cDovL2Nh
Y2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0R2xvYmFsRzNUTFNFQ0NTSEEzODQy
MDIwQ0ExLTIuY3J0MAwGA1UdEwEB/wQCMAAwggF7BgorBgEEAdZ5AgQCBIIBawSC
AWcBZQB0AA5XlLzzrqk+MxssmQez95Dfm8I9cTIl3SGpJaxhxU4hAAABlGd6v8cA
AAQDAEUwQwIfJBcPWkx80ik7uLYW6OGvNYvJ4NmOR2RXc9uviFPH6QIgUtuuUenH
IT5UNWJffBBRq31tUGi7ZDTSrrM0f4z1Va4AdQBkEcRspBLsp4kcogIuALyrTygH
1B41J6vq/tUDyX3N8AAAAZRnesAFAAAEAwBGMEQCIHCu6NgHhV1Qvif/G7BHq7ci
MGH8jdch/xy4LzrYlesXAiByMFMvDhGg4sYm1MsrDGVedcwpE4eN0RuZcFGmWxwJ
cgB2AEmcm2neHXzs/DbezYdkprhbrwqHgBnRVVL76esp3fjDAAABlGd6wBkAAAQD
AEcwRQIgaFh67yEQ2lwgm3X16n2iWjEQFII2b2fpONtBVibZVWwCIQD5psqjXDYs
IEb1hyh0S8bBN3O4u2sA9zisKIlYjZg8wjAKBggqhkjOPQQDAwNoADBlAjEA+aaC
RlPbb+VY+u4avPyaG7fvUDJqN8KwlrXD4XptT7QL+D03+BA/FUEo3dD1iz37AjBk
Y3jhsuLAW7pWsDbtX/Qwxp6kNsK4jh1/RjvV/260sxQwM/GM7t0+T0uP2L+Y12U=
-----END CERTIFICATE-----
接下来我们逐一解释一下这些字段含义
5.3.2 关键字段详解
Data(基本信息)
Version(版本)
- 值:3 (0x2)
- 含义:X.509证书的版本号。版本3(V3)是当前最广泛使用的版本,支持扩展字段(Extensions)。
- 说明 :
- 版本1(V1)仅包含基本字段。
- 版本2(V2)增加了扩展字段的支持,但未被广泛采用。
- 版本3(V3)通过扩展字段(Extensions)增强了证书的功能(如CRL分发点、OCSP等)。
Serial Number(序列号)
-
值 :
0a:d8:93:ba:fa:68:b0:b7:fb:7a:40:4f:06:ec:af:9a -
含义:由证书颁发机构(CA)为每个证书分配的唯一标识符。
-
用途 :
- 用于证书的唯一性验证。
- 在CRL(证书吊销列表)中引用证书时使用。
-
特点:
- **唯一性:**在同一CA内必须唯一
- **长度:**最多20字节(160位)
- **格式:**正整数,通常用十六进制表示
- **用途:**证书撤销、审计追踪
Signature Algorithm(签名算法)
- 值 :
ecdsa-with-SHA384 - 含义:证书签名使用的算法,由CA对证书内容进行签名。
- 说明 :
ecdsa:椭圆曲线数字签名算法(Elliptic Curve Digital Signature Algorithm)。SHA384:使用SHA-384哈希算法生成摘要。- 该算法组合提供高安全性和效率。
Issuer(颁发者)
- 值 :
C=US, O=DigiCert Inc, CN=DigiCert Global G3 TLS ECC SHA384 2020 CA1 - 含义:证书的颁发机构(CA)的名称。
- 字段解析 :
C=US:国家(美国)。O=DigiCert Inc:组织名称(DigiCert公司)。CN=...:通用名称(CA的名称)。
Validity(有效期)
- Not Before :
Jan 15 00:00:00 2025 GMT - Not After :
Jan 15 23:59:59 2026 GMT - 含义:证书的有效时间段。
- 用途 :
- 在
Not Before之前或Not After之后,证书不可用。 - 用于验证证书是否在有效期内。
- 在
Subject(主题)
- 值 :
C=US, ST=California, L=Los Angeles, O=Internet Corporation for Assigned Names and Numbers, CN=*.example.com - 含义:证书持有者的身份信息。
- 字段解析 :
C=US:国家(美国)。ST=California:州(加利福尼亚州)。L=Los Angeles:城市(洛杉矶)。O=...:组织名称(ICANN)。CN=*.example.com:通用名称(通配符域名,覆盖所有example.com的子域名)。
Subject Public Key Info(主题公钥信息)
- Public Key Algorithm :
id-ecPublicKey - Public-Key:256位的椭圆曲线公钥(P-256曲线)。
- ASN1 OID :
prime256v1 - NIST CURVE :
P-256 - 说明 :
- 使用椭圆曲线加密(ECC)算法生成的公钥。
prime256v1是NIST定义的椭圆曲线标准(P-256),提供256位安全性。- 公钥用于加密数据或验证签名。
X509v3 Extensions(扩展字段)
Authority Key Identifier(颁发者密钥标识符)
- 值 :
keyid:8A:23:EB:9E:6B:D7:F9:37:5D:F9:6D:21:39:76:9A:A1:67:DE:10:A8 - 含义:CA的公钥标识符,用于验证签名。
- 用途:在证书链中,用于匹配CA的公钥和子证书的签名算法。
Subject Key Identifier(主题密钥标识符)
- 值 :
F0:C1:6A:32:0D:EC:DA:C7:EA:8F:CD:0D:6D:19:12:59:D1:BE:72:ED - 含义:证书持有者的公钥标识符。
- 用途:用于唯一标识证书的公钥,避免因序列号重复导致的混淆。
Subject Alternative Name(主题备用名称)
- 值 :
DNS:*.example.com, DNS:example.com - 含义:证书覆盖的域名列表。
- 用途 :
- 通配符证书(
*.example.com)可覆盖所有子域名(如www.example.com、mail.example.com)。 - 明确列出主域名(
example.com)。
- 通配符证书(
Certificate Policies(证书策略)
- 值 :
Policy: 2.23.140.1.2.2,CPS: http://www.digicert.com/CPS - 含义:证书颁发机构的策略声明。
- 用途 :
Policy:标识CA的策略OID(对象标识符)。CPS:指向CA的证书策略文档,说明颁发证书的规则。
Key Usage(关键用途)
- 值 :
Digital Signature, Key Agreement(critical) - 含义:证书的用途限制。
- 说明 :
Digital Signature:允许使用私钥进行数字签名。Key Agreement:允许密钥协商(如ECDH)。critical:该字段必须被遵循,否则证书无效。
Extended Key Usage(扩展关键用途)
- 值 :
TLS Web Server Authentication, TLS Web Client Authentication - 含义:证书的扩展用途。
- 用途 :
- 服务器认证(TLS Web Server):用于HTTPS等服务。
- 客户端认证(TLS Web Client):用于双向认证(如企业内网登录)。
CRL Distribution Points(CRL分发点)
- 值:
plain
URI:http://crl3.digicert.com/...
URI:http://crl4.digicert.com/...
- 含义:证书吊销列表(CRL)的下载地址。
- 用途 :
- 客户端可通过这些URL检查证书是否被吊销。
- 提供冗余,确保CRL可访问性。
Authority Information Access(权威信息访问)
- 值:
plain
OCSP - URI:http://ocsp.digicert.com
CA Issuers - URI:http://cacerts.digicert.com/...
- 含义:CA提供的在线服务地址。
- 用途 :
OCSP:在线证书状态协议(OCSP)的查询地址,用于实时验证证书状态。CA Issuers:CA证书的下载地址,用于构建证书链。
Basic Constraints(基本约束)
- 值 :
CA:FALSE(critical) - 含义:证书是否为CA证书。
- 说明 :
CA:FALSE:该证书不能作为CA签发其他证书。critical:该字段必须被遵循,否则证书无效。
CT Precertificate SCTs(证书透明度SCTs)
- 值:多个Signed Certificate Timestamp(SCT)记录。
- 含义:证书透明度(Certificate Transparency, CT)的日志记录。
- 用途 :
- 防止CA滥用,确保所有证书被公开记录。
- 包含时间戳、日志ID、签名等信息,用于验证证书合法性。
Signature Algorithm(签名算法)
- 值 :
ecdsa-with-SHA384 - 含义:CA对证书内容进行签名的算法。
- 说明 :
- 签名覆盖整个证书内容,确保数据完整性。
- 使用与公钥相同的算法(ECDSA + SHA384)。
PEM编码的证书(Base64格式)
- 值 :以
-----BEGIN CERTIFICATE-----开头,-----END CERTIFICATE-----结尾的Base64编码字符串。 - 含义:证书的二进制数据经过Base64编码后的文本形式。
- 用途 :
- 便于在文本文件或网络传输中存储和传输证书。
- 可以通过OpenSSL工具解析或验证。
5.3.3 扩展字段详解
X.509v3引入了扩展字段机制,大大增强了证书的功能和灵活性。这些扩展字段是现代PKI系统的重要组成部分。

5.4 数字证书分类
根据不同的分类标准,数字证书可以分为多种类型,每种类型都有其特定的用途和特点。
5.4.1 按照验证级别分类
🟢 DV (Domain Validated) - 域名验证证书
验证内容:
- 域名控制权
- DNS记录验证
- HTTP文件验证
- 邮箱验证
特点:
- 验证简单快速
- 价格便宜
- 自动化颁发
- 适合个人网站
代表:
- Let's Encrypt
- Cloudflare SSL
- 基础商业证书
🟡 OV (Organization Validated) - 组织验证证书
验证内容:
- 域名控制权
- 组织真实性
- 营业执照
- 电话验证
特点:
- 中等验证强度
- 显示组织信息
- 人工审核
- 适合企业网站
证书信息:
- 包含组织名称
- 包含地理位置
- 1-3天颁发
🔴 EV (Extended Validation) - 扩展验证证书
验证内容:
- 严格的组织验证
- 法律实体确认
- 授权人员验证
- 物理地址确认
特点:
- 最高验证级别
- 绿色地址栏
- 严格审核流程
- 适合金融机构
浏览器显示:
- 组织名称显示
- 特殊UI指示
- 7-14天颁发
5.4.2 按用途分类
🌐 SSL/TLS服务器证书
- **用途:**HTTPS网站加密
- **验证:**服务器身份
- **密钥用途:**密钥交换、数字签名
- **扩展用途:**服务器认证
👤 客户端证书
- **用途:**客户端身份认证
- **验证:**用户身份
- **密钥用途:**数字签名
- **扩展用途:**客户端认证
📧 S/MIME证书
- **用途:**邮件加密和签名
- **验证:**邮箱地址
- **密钥用途:**数字签名、密钥加密
- **扩展用途:**邮件保护
💾 代码签名证书
- **用途:**软件代码签名
- **验证:**开发者身份
- **密钥用途:**数字签名
- **扩展用途:**代码签名
⏰ 时间戳证书
- **用途:**提供可信时间戳
- **验证:**时间戳服务
- **密钥用途:**数字签名
- **扩展用途:**时间戳
🏛️ CA证书
- **用途:**签发其他证书
- **验证:**CA身份
- **密钥用途:**证书签名、CRL签名
- **基本约束:**CA=TRUE
5.5 信任链与CA
你可能会问,我们怎么信任 CA 本身呢?答案是"信任链 (Chain of Trust)"。数字证书通过证书链建立信任关系,从根证书到终端实体证书形成一条完整的信任链。

- 根证书 (Root Certificate): 这是信任链的顶点。根 CA 是顶级权威机构,它们的证书是"自签名"的。我们之所以信任它们,是因为它们的公钥(根证书)已经预先安装在我们的操作系统(Windows, macOS, Linux)或浏览器(Chrome, Firefox)中了。这个预置的"信任锚"列表由操作系或浏览器厂商严格审核和维护。
- 中级证书 (Intermediate Certificate): 为了安全,根 CA 通常不直接签发最终的用户证书。它们会先签发一个或多个中级证书。这样做的好处是,根 CA 的私钥可以保持离线,极大地降低了泄露风险。日常的证书签发工作都由中级 CA 完成。
- 服务器证书 (Server Certificate): 这就是最终部署在你的网站服务器上的证书,它由中级 CA 签名。
当浏览器收到服务器证书时,它会沿着这条链向上追溯,用中级证书的公钥验证服务器证书的签名,再用根证书的公钥验证中级证书的签名,直到找到一个内置于系统中的可信根证书为止。如果整条链都验证通过,信任就建立起来了。
5.6 浏览器如何验证证书
当你在浏览器中访问一个 https:// 网站时,浏览器会执行一套严格的检查流程:
- 检查数字签名
- 浏览器获取证书链,从服务器证书开始,用其签发者(中级 CA)的公钥来验证签名是否有效。然后,再用根 CA 的公钥验证中级 CA 证书的签名。这一步确保了证书没有被篡改。
- 检查信任链
- 确认证书链的最终源头是否是一个浏览器或操作系统所信任的根 CA。如果链的尽头是一个不被信任的根,或者链不完整,验证就会失败。
- 检查有效期
- 检查当前时间是否在证书的 Not Before
和 Not After字段之间。任何过期的证书都会被视为无效。
- 检查当前时间是否在证书的 Not Before
- 检查主机名
- 检查你正在访问的域名(如 www.example.com)是否存在于证书的 SAN 字段或 CN 字段中。如果不匹配,浏览器会发出警告,防止钓鱼攻击。
- 检查吊销状态
- 浏览器会尝试确认证书是否已被其签发者吊销(例如,因为私钥泄露)。这通常通过两种方式进行:
- CRL (证书吊销列表): 下载一个包含所有被吊销证书序列号的列表。效率较低。
- OCSP (在线证书状态协议): 向 CA 发送一个实时查询请求,询问特定序列号的证书是否有效。更高效,是目前的主流方式。
- 浏览器会尝试确认证书是否已被其签发者吊销(例如,因为私钥泄露)。这通常通过两种方式进行:
只有当所有这些检查都通过时,浏览器地址栏才会显示安全锁 🔒 标志。
5.7 证书吊销机制
当证书的私钥泄露、证书信息错误或其他安全问题时,需要撤销证书以防止其被恶意使用。
📋 CRL (Certificate Revocation List)
工作原理:
- CA定期发布撤销证书列表
- 客户端下载并检查CRL
- 列表包含撤销证书的序列号
优点:
- 简单可靠
- 离线验证
- 广泛支持
缺点:
- 文件可能很大
- 更新不及时
- 带宽消耗大
CRL示例结构: Certificate Revocation List (CRL): Version: 2 (0x1) Signature Algorithm: sha256WithRSAEncryption Issuer: CN=Example CA Last Update: Jan 15 12:00:00 2024 GMT Next Update: Jan 22 12:00:00 2024 GMT Revoked Certificates: Serial Number: 1234567890ABCDEF Revocation Date: Jan 10 10:30:00 2024 GMT CRL Reason: Key Compromise Serial Number: FEDCBA0987654321 Revocation Date: Jan 12 14:15:00 2024 GMT CRL Reason: Certificate Hold
🔄 OCSP (Online Certificate Status Protocol)
工作原理:
- 客户端实时查询证书状态
- OCSP响应器返回状态信息
- 支持Good、Revoked、Unknown状态
优点:
- 实时状态查询
- 响应数据小
- 及时性好
缺点:
- 需要网络连接
- 可能影响性能
- 隐私问题
OCSP请求/响应示例: Request: Certificate ID: Hash Algorithm: SHA1 Issuer Name Hash: A1B2C3D4... Issuer Key Hash: E5F6A7B8... Serial Number: 1234567890ABCDEF Response: Response Status: successful Certificate Status: good This Update: Jan 15 12:00:00 2024 GMT Next Update: Jan 16 12:00:00 2024 GMT
5.8 证书文件常见格式
在配置服务器时,你可能会遇到各种不同扩展名的证书文件,这常常令人困惑。以下是一些常见的格式:
- PEM (.pem, .crt, .cer, .key): 最常见的格式。它是一种 Base64 编码的 ASCII 文本文件,以
----BEGIN CERTIFICATE-----``开头,以-----END CERTIFICATE-----` 结尾。可以包含证书、私钥、证书链等。Apache 和 Nginx 等服务器广泛使用此格式。 - DER (.der, .cer): 二进制格式的证书,不包含 BEGIN/END`这样的页眉页脚。通常用于 Java 平台。
- PKCS#12 (.p12, .pfx): 一种二进制格式的"档案文件",可以把服务器证书、所有中级证书和私钥都打包在一个加密的文件中。常用于在 Windows 服务器(IIS)上导入和导出证书。
6、TLS和http
6.1 http的安全问题
HTTP (HyperText Transfer Protocol) 是Web通信的基础协议,但它存在严重的安全缺陷:
- 明文传输: 所有数据以明文形式传输,容易被窃听
- 无身份验证: 无法验证服务器的真实身份
- 数据篡改: 传输过程中数据可能被恶意修改
- 会话劫持: 攻击者可以劫持用户会话
- 中间人攻击: 攻击者可以拦截和修改通信内容
6.2 https = http + TLS/SSL
HTTPS (HTTP Secure) 是HTTP协议的安全版本,通过在HTTP和TCP之间添加TLS/SSL层来解决安全问题。

7、Wireshark抓包分析TLS
我们用Wireshark来分析一下整个的TLS过程,加深理解
7.1 准备
打开两个shell窗口,第一个执行命令如下,用于抓包
bash
tcpdump -i eth0 -w /tmp/test.pcap

第二个窗口执行命令:
bash
curl https://example.com

7.2 wireshark分析
把抓取到的包text.pcap用wireshark打开,输入过滤命令tls and ip.addr==23.215.0.138

接下来看下整个的握手过程
7.2.1 Client Hello
查看第一个数据包 Client Hello,初始协商



详细字段说明:
| 层级 | 字段 | 值 | 解释 |
|---|---|---|---|
| **** 记录层 (Record Layer) | Content Type |
Handshake (22) |
作用 : 标识该记录层内部承载的数据类型。22代表这是一个握手协议消息,区别于应用数据(23)或警报(21)。 |
Version |
TLS 1.0 (0x0301) |
作用: 指定记录层本身的协议版本。为了最大限度地兼容旧的网络设备(中间件),即使客户端支持更高版本,这里也常常会使用一个较低的版本(如TLS 1.0)。真正协商的协议版本在握手协议内部。 | |
Length |
262 |
作用: 指明紧随其后的握手协议消息的总长度(单位:字节)。 | |
| **** 握手协议 (Handshake Protocol) | Handshake Type |
Client Hello (1) |
作用 : 明确握手消息的类型。1代表这是握手过程的第一步:客户端问候(Client Hello)。 |
Length |
258 |
作用 : 指明Client Hello消息体本身的长度。 |
|
Version |
TLS 1.2 (0x0303) |
作用 : 这是客户端真正提议使用的最高TLS版本。服务器将根据此值和自身支持情况,选择一个最终的通信版本。 | |
Random |
GMT Unix Time: Jul 16, 2025... |
作用: 一个32字节的随机数,由4字节时间戳和28字节随机数构成。它和服务器生成的随机数一起,是后续生成对称会话密钥的关键材料,能有效防止重放攻击。 | |
Session ID |
Length: 0 |
作用 : 用于实现"会话恢复"。如果客户端有之前与该服务器建立的会话ID,就会携带它来尝试快速恢复会话,跳过耗时的完整握手。长度为0表示请求进行一次全新的、完整的握手。 |
|
Cipher Suites |
108 suites |
作用: 这是客户端支持的加密套件列表,按客户端的偏好顺序排列。一个加密套件定义了一整套算法(密钥交换、身份验证、对称加密、消息认证)。服务器会从这个列表中选择一个它也支持的套件。 | |
Compression Methods |
Length: 1, Method: null (0) |
作用 : 客户端支持的数据压缩方法。由于存在安全漏洞(如CRIME攻击),现代TLS通信基本都禁用压缩,所以值通常为null。 |
|
| **** 扩展 (Extensions) | server_name (SNI) |
Server Name: example.com |
作用: 服务器名称指示。允许客户端告诉服务器它想访问哪个具体域名。这对于虚拟主机(一个IP地址托管多个网站)至关重要,服务器可根据此域名返回正确的证书。 |
renegotiation_info |
Renegotiation Info extension length: 0 |
作用: 一个安全增强扩展,用于防止在会话重新协商过程中的某些中间人攻击。 | |
session_ticket |
Session Ticket: <MISSING> |
作用: 这是另一种更现代的会话恢复机制。如果客户端有服务器上次发送的"会话票证",就可以在这里提交,实现无状态的会话恢复,服务器无需在本地保存会话信息。 | |
supported_groups |
secp256r1, x25519, ... |
作用: 客户端支持的命名椭圆曲线列表。这些曲线用于椭圆曲线迪菲-赫尔曼密钥交换(ECDHE),该算法能提供"前向保密性"(PFS),即即使私钥泄露,过去的会话密钥也不会泄露。 | |
ec_point_formats |
uncompressed (0) |
作用 : 客户端支持的椭圆曲线上点的表示格式。uncompressed是最常见、兼容性最好的一种。 |
|
signature_algorithms |
rsa_pkcs1_sha256, ecdsa_secp256r1_sha256, ... |
作用: 客户端能验证的数字签名算法列表。这告知服务器在发送数字证书和签名密钥交换参数时可以使用哪些类型的签名,以便客户端能够成功验证服务器身份。 | |
application_layer_protocol_negotiation (ALPN) |
ALPN Protocol: h2, http/1.1 |
作用: 应用层协议协商。允许客户端在TLS握手期间就指明它支持的应用层协议(如HTTP/2或HTTP/1.1),避免了在TLS连接建立后再进行一次协议协商,提高了连接效率。 |
7.2.2 Server Hello
查看第二个数据包,Server Hello

详细字段解释
| 层级 | 字段 (Field) | 抓包中的值 (Value from Capture) | 更详细的解释 |
|---|---|---|---|
| 记录层 (Record Layer) | Content Type |
Handshake (22) |
作用 : 标识该记录层帧内部承载的数据类型。22代表这是一个握手协议消息,与Client Hello保持一致。 |
Version |
TLS 1.2 (0x0303) |
作用: 记录层协议版本。此处使用TLS 1.2,表明服务器确认使用此版本进行通信,这是经过协商后的最终版本。 | |
Length |
84 |
作用: 指明紧随其后的握手协议消息的总长度(单位:字节)。比Client Hello的262字节要小很多,因为服务器只需要做出选择而不是提供选项列表。 | |
| **** 握手协议 (Handshake Protocol) | Handshake Type |
Server Hello (2) |
作用 : 明确握手消息的类型。2代表这是握手过程的第二步:服务器问候(Server Hello),是对Client Hello的响应。 |
Length |
80 |
作用 : 指明Server Hello消息体本身的长度。 |
|
Version |
TLS 1.2 (0x0303) |
作用 : 服务器最终选择的TLS协议版本。这是服务器根据Client Hello中提议的版本和自身支持情况做出的决定,将用于后续的所有通信。 | |
Random |
06bca23121cdfd6c... |
作用 : 服务器生成的32字节随机数,包含4字节时间戳(GMT Unix Time: Aug 1, 1973)和28字节随机数。与客户端随机数一起,构成后续生成对称会话密钥的关键材料。注意: 显示的时间戳异常(1973年)可能表明服务器故意使用随机值而非真实时间。 | |
Session ID Length |
0 |
作用 : 服务器返回的会话ID长度。0表示服务器选择不使用传统的会话恢复机制,客户端下次连接时需要进行完整握手。 |
|
Cipher Suite |
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 (0xc02c) |
作用 : 服务器从Client Hello提供的加密套件中最终选择 的一个。此套件使用: • ECDHE : 椭圆曲线迪菲-赫尔曼密钥交换(提供前向保密性) • ECDSA : 椭圆曲线数字签名算法(用于身份验证) • AES_256_GCM : 256位AES加密,GCM模式(提供加密和认证) • SHA384: 384位SHA哈希算法(用于完整性校验) | |
Compression Method |
null (0) |
作用 : 服务器选择的压缩方法。选择null表示不使用压缩,这是现代TLS的标准做法,避免CRIME等压缩相关攻击。 |
|
Extensions Length |
40 |
作用: 所有扩展字段的总长度。 | |
| **** 扩展 (Extensions) | renegotiation_info |
Length: 1, extension length: 0 |
作用: 重新协商信息扩展,用于防止重新协商攻击。长度为0表示这是初始握手,没有之前的协商信息。 |
server_name |
Length: 0 |
作用: 服务器名称指示响应。长度为0表示服务器确认了客户端的SNI请求,但没有额外信息需要返回。 | |
ec_point_formats |
Length: 4, formats: uncompressed(0), ansiX962_compressed_prime(1), ansiX962_compressed_char2(2) |
作用 : 服务器支持的椭圆曲线点格式。返回3种格式表明服务器的兼容性较好,但实际通信中通常使用uncompressed格式。 |
|
session_ticket |
Length: 0, Ticket: <MISSING> |
作用: 会话票证扩展。长度为0且票证缺失,表明服务器支持会话票证机制,但在这次握手中没有提供新的票证(可能在后续的NewSessionTicket消息中提供)。 | |
status_request |
Length: 0 |
作用: OCSP装订扩展。服务器确认支持OCSP装订功能,可以在握手过程中直接提供证书吊销状态信息,无需客户端单独查询OCSP服务器。 | |
application_layer_protocol_negotiation (ALPN) |
Length: 11, Protocol: http/1.1 |
作用 : 应用层协议协商结果。服务器从Client Hello提供的协议列表(h2, http/1.1)中选择了http/1.1,表明后续的应用层通信将使用HTTP/1.1协议而非HTTP/2。 |
|
| 指纹信息 | JA3S Fullstring |
771,49196,65281-0-11-35-5-16 |
作用: JA3S是Server Hello的指纹,用于识别服务器的TLS实现。格式为:TLS版本,选择的加密套件,扩展列表。 |
JA3S Hash |
42ec7b1db61428bf1cc6e01b9ef02b04 |
作用: JA3S字符串的MD5哈希值,用于快速比较和识别服务器特征。 |
7.3 Certificate
这个包里还有 Certificate身份认证

详细字段解释:
| 层级 | 字段 (Field) | 抓包中的值 (Value from Capture) | 更详细的解释 |
|---|---|---|---|
| 记录层 (Record Layer) | Content Type |
Handshake (22) |
作用 : 标识该记录层帧内部承载的数据类型。22代表这是一个握手协议消息,与之前的Client Hello和Server Hello保持一致。 |
Version |
TLS 1.2 (0x0303) |
作用: 记录层协议版本。确认使用TLS 1.2版本进行通信。 | |
Length |
2345 |
作用: 指明紧随其后的握手协议消息的总长度(单位:字节)。Certificate消息通常是握手过程中最大的消息,因为包含了完整的证书链。 | |
| 握手协议 (Handshake Protocol) | Handshake Type |
Certificate (11) |
作用 : 明确握手消息的类型。11代表这是握手过程的第三步:证书消息(Certificate),服务器通过此消息向客户端发送其身份证明。 |
Length |
2341 |
作用 : 指明Certificate消息体本身的长度。 |
|
Certificates Length |
2338 |
作用: 整个证书链的总长度。包含了所有证书的数据。 | |
| 证书链 (Certificate Chain) | Certificate Count |
2个证书 |
作用: 该证书链包含2个证书,构成了从服务器证书到根证书的信任链。第一个是服务器的叶子证书(End Entity Certificate),第二个是中间证书(Intermediate Certificate)。 |
第一个证书(服务器证书/叶子证书)
| 字段 | 值 | 解释 |
|---|---|---|
Certificate Length |
1439 |
作用: 第一个证书的长度(字节)。这是服务器的叶子证书,包含了服务器的公钥和身份信息。 |
Version |
v3 (2) |
作用: X.509证书版本。v3是目前最常用的版本,支持扩展字段,提供了更丰富的功能。 |
Serial Number |
0x0ad893bafa68b0b7fb7a404f06ecaf9a |
作用: 证书序列号,由CA分配的唯一标识符。用于识别特定的证书,在证书吊销时也会用到此序列号。 |
Signature Algorithm |
ecdsa-with-SHA384 |
作用: 证书签名算法。使用椭圆曲线数字签名算法(ECDSA)结合SHA-384哈希算法。这是一种现代的、安全性高的签名算法。 |
Issuer |
rdnSequence (0) |
作用: 证书颁发者(CA)的标识信息。从证书数据推断,这应该是DigiCert Global G3中间证书。 |
Validity |
有效期信息 |
作用: 证书的有效期,包含"不早于"和"不晚于"时间戳。客户端会验证当前时间是否在有效期内。 |
Subject |
rdnSequence (0) |
作用: 证书主体(服务器)的标识信息,包含域名、组织等信息。 |
Subject Public Key Info |
公钥信息 |
作用: 服务器的公钥信息,包含公钥算法和公钥数据。客户端将使用此公钥验证服务器的身份。 |
Extensions |
10 items |
作用 : X.509 v3扩展字段,包含了额外的证书信息,如: • Subject Alternative Name (SAN) : 证书支持的域名列表 • Key Usage : 密钥用途(如数字签名、密钥加密) • Extended Key Usage : 扩展密钥用途(如服务器认证) • Authority Key Identifier : 颁发者密钥标识符 • CRL Distribution Points: 证书吊销列表分发点 |
Algorithm Identifier |
ecdsa-with-SHA384 (1.2.840.10045.4.3.3) |
作用: 数字签名算法的OID标识符。明确指定了使用ECDSA with SHA-384算法。 |
Encrypted (Signature) |
3065023100f9a6824653db6fe558faee1abcfc9a1bb7ef50... |
作用: 证书的数字签名数据。这是CA使用其私钥对证书内容进行签名的结果。客户端会使用CA的公钥验证此签名。 |
第二个证书(中间证书)
| 字段 | 值 | 解释 |
|---|---|---|
Certificate Length |
893 |
作用: 第二个证书的长度(字节)。这是中间证书,用于在服务器证书和根证书之间建立信任链。 |
Version |
v3 (2) |
作用: X.509证书版本v3。 |
Serial Number |
0x0b00e92d4d6d731fca3059c7cb1e1886 |
作用: 中间证书的序列号,由根CA分配。 |
Signature Algorithm |
ecdsa-with-SHA384 |
作用: 中间证书的签名算法,与服务器证书使用相同的算法。 |
Issuer |
rdnSequence (0) |
作用: 中间证书的颁发者,从证书数据推断应该是DigiCert的根证书。 |
Validity |
有效期信息 |
作用: 中间证书的有效期,通常比服务器证书的有效期更长。 |
Subject |
rdnSequence (0) |
作用: 中间证书的主体信息,这应该是DigiCert Global G3中间CA的信息。 |
Subject Public Key Info |
公钥信息 |
作用: 中间CA的公钥,用于验证服务器证书的签名。 |
Extensions |
8 items |
作用 : 中间证书的扩展字段,通常包含: • Basic Constraints : 标识这是一个CA证书 • Key Usage : 证书签名、CRL签名等用途 • Authority Key Identifier : 根CA的密钥标识符 • Subject Key Identifier: 本证书的密钥标识符 |
Algorithm Identifier |
ecdsa-with-SHA384 (1.2.840.10045.4.3.3) |
作用: 中间证书的签名算法标识符。 |
Encrypted (Signature) |
306502307e26586eee88ec0cdd1541ee7ab8999970d162654fa0... |
作用: 中间证书的数字签名,由根CA私钥签名。客户端会使用根CA公钥验证此签名。 |
7.4 Certificate Status
该包还有一个 Certificate Status, 是 TLS 握手过程中的一个重要安全增强步骤,它实现了 OCSP 装订功能。

详细字段解释:
| 层级 | 字段 (Field) | 抓包中的值 (Value from Capture) | 更详细的解释 |
|---|---|---|---|
| **** 记录层 (Record Layer) | Content Type |
Handshake (22) |
作用 : 标识该记录层帧内部承载的数据类型。22 代表这是一个握手协议消息,与之前的握手消息保持一致。 |
Version |
TLS 1.2 (0x0303) |
作用: 记录层协议版本。确认使用TLS 1.2版本进行通信。 | |
Length |
321 |
作用: 指明紧随其后的握手协议消息的总长度(单位:字节)。Certificate Status消息相对较小,包含了OCSP响应数据。 | |
| **** 握手协议 (Handshake Protocol) | Handshake Type |
Certificate Status (22) |
作用 : 明确握手消息的类型。22 代表这是Certificate Status消息,用于提供证书吊销状态信息。这是OCSP装订(OCSP Stapling)的实现。 |
Length |
317 |
作用 : 指明Certificate Status 消息体本身的长度。 |
|
Certificate Status Type |
OCSP (1) |
作用 : 指明证书状态类型。1 代表使用OCSP(Online Certificate Status Protocol)协议来查询证书状态。这是目前最常用的证书状态查询方式。 |
|
OCSP Response Length |
313 |
作用: OCSP响应数据的总长度。 |
OCSP 响应结构
| 字段 | 值 | 解释 |
|---|---|---|
Response Status |
successful (0) |
作用 : OCSP查询的总体状态。0 表示查询成功,OCSP响应器成功处理了查询请求。其他可能值包括: • 1malformedRequest(请求格式错误) • 2internalError(内部错误) • 3 tryLater(稍后重试) • 5sigRequired(需要签名) • 6unauthorized(未授权) |
Response Type ID |
1.3.6.1.5.5.7.48.1.1 (id-pkix-ocsp-basic) |
作用: OCSP响应的类型标识符。这个OID表示这是一个基本的OCSP响应(BasicOCSPResponse),是最常用的OCSP响应格式。 |
基本 OCSP 响应 (BasicOCSPResponse)
| 字段 | 值 | 解释 |
|---|---|---|
Responder ID |
byKey (2) |
作用 : OCSP响应器的标识方式。byKey 表示使用密钥哈希来标识响应器,而不是使用证书DN(Distinguished Name)。 |
byKey |
8a23eb9e6bd7f9375df96d2139769aa167de10a8 |
作用: OCSP响应器公钥的SHA-1哈希值。客户端可以使用此值来验证响应器的身份,确保响应来自授权的OCSP响应器。 |
Produced At |
Jul 16, 2025 05:43:35.000000000 中国标准时间 |
作用: OCSP响应的生成时间。这是OCSP响应器创建此响应的准确时间戳,用于验证响应的时效性。 |
Responses |
1 item |
作用: 此OCSP响应包含1个证书状态响应。通常每个证书需要一个单独的响应。 |
单个证书响应 (SingleResponse)
| 字段 | 值 | 解释 |
|---|---|---|
| 证书标识 (CertID) | ||
Hash Algorithm |
SHA-1 (1.3.14.3.2.26) |
作用: 用于计算证书标识哈希的算法。虽然SHA-1在其他场景中被认为不够安全,但在OCSP中仍被广泛使用,因为这里主要用于标识而非安全保护。 |
Issuer Name Hash |
bf9bcbef71e2b39b8d19487acfc75885354f8f02 |
作用: 证书颁发者DN的SHA-1哈希值。用于唯一标识证书的颁发者,确保查询的是正确CA颁发的证书。 |
Issuer Key Hash |
8a23eb9e6bd7f9375df96d2139769aa167de10a8 |
作用: 证书颁发者公钥的SHA-1哈希值。提供了另一种标识颁发者的方式,与上面的byKey值相同,表明这是同一个CA。 |
Serial Number |
0x0ad893bafa68b0b7fb7a404f06ecaf9a |
作用: 被查询证书的序列号。这与之前Certificate消息中服务器证书的序列号完全一致,确认这个OCSP响应是针对服务器证书的。 |
| 证书状态 (CertStatus) | ||
Cert Status |
good (0) |
作用 : 证书的当前状态。good 表示证书有效且未被吊销。其他可能状态包括:revoked (1) - 证书已被吊销unknown (2) - 证书状态未知 |
This Update |
Jul 16, 2025 05:27:02.000000000 中国标准时间 |
作用: 此状态信息的更新时间。表明证书状态信息最后一次更新的时间,用于判断信息的新鲜度。 |
Next Update |
Jul 23, 2025 04:27:02.000000000 中国标准时间 |
作用: 下次状态更新的计划时间。客户端可以在此时间之前缓存此响应,无需重新查询。这里显示有效期为7天。 |
签名信息
| 字段 | 值 | 解释 |
|---|---|---|
Signature Algorithm |
ecdsa-with-SHA384 (1.2.840.10045.4.3.3) |
作用: OCSP响应的签名算法。使用ECDSA with SHA-384,这是一种现代的、安全的签名算法,确保OCSP响应的完整性和真实性。 |
Padding |
0 |
作用: 签名填充,ECDSA算法不需要填充。 |
Signature |
3065023100dc94c2e3953693080bc85829600d6cdd993561f2d7... |
作用: OCSP响应的数字签名。由OCSP响应器使用其私钥签名,客户端会使用响应器的公钥验证此签名,确保响应未被篡改。 |
7.5 Server Key Exchange
查看下一个数据包 秘钥交换

详细字段解释:
| 层级 | 字段 (Field) | 抓包中的值 (Value from Capture) | 更详细的解释 |
|---|---|---|---|
| 记录层 (Record Layer) | Content Type |
Handshake (22) |
作用 : 标识该记录层帧内部承载的数据类型。22代表这是一个握手协议消息,与之前的握手消息保持一致。 |
Version |
TLS 1.2 (0x0303) |
作用: 记录层协议版本。确认使用TLS 1.2版本进行通信。 | |
Length |
149 |
作用: 指明紧随其后的握手协议消息的总长度(单位:字节)。Server Key Exchange消息相对较小,主要包含椭圆曲线参数和服务器公钥。 | |
| **** 握手协议 (Handshake Protocol) | Handshake Type |
Server Key Exchange (12) |
作用 : 明确握手消息的类型。12代表这是Server Key Exchange消息,用于在需要时向客户端发送服务器的临时公钥参数。此消息只在某些密钥交换算法(如ECDHE)中出现。 |
Length |
145 |
作用 : 指明Server Key Exchange消息体本身的长度。 |
椭圆曲线 (EC Diffie-Hellman Server Params)
| 字段 | 值 | 解释 |
|---|---|---|
Curve Type |
named_curve (0x03) |
作用 : 椭圆曲线类型标识符。0x03 表示使用命名曲线(Named Curve),这是最常用的方式。其他可能值包括:0x01 - explicit_prime(显式素数域曲线)0x02 - explicit_char2(显式特征2域曲线)命名曲线方式使用预定义的标准曲线,既安全又高效。 |
Named Curve |
secp256r1 (0x0017) |
作用 : 具体的椭圆曲线标识符。secp256r1 是NIST P-256曲线的别名,这是目前最广泛使用的椭圆曲线之一。特点:安全级别 : 提供128位等效安全强度性能 : 在大多数平台上都有良好的性能标准化 : 被多个国际标准采用兼容性: 几乎所有现代系统都支持 |
Pubkey Length |
65 |
作用: 服务器椭圆曲线公钥的长度(字节)。对于secp256r1曲线,未压缩格式的公钥长度固定为65字节:1字节:格式标识符(0x04,表示未压缩)32字节:X坐标32字节:Y坐标 |
Pubkey |
0471a26707cfb01ceb58f4f5dcffe69be20cca165487308a3864aa868f7e6eb5597fdac70af9335e8785585c812e8c164ab8f1d4c13ed91bd313c1fa48931b445b |
作用 : 服务器的临时椭圆曲线公钥。这是服务器为本次会话生成的临时密钥对的公钥部分。结构分解:04 : 未压缩点格式标识符71a26707cfb01ceb58f4f5dcffe69be20cca165487308a3864aa868f7e6eb559 : X坐标(32字节)7fdac70af9335e8785585c812e8c164ab8f1d4c13ed91bd313c1fa48931b445b : Y坐标(32字节)安全特性: 这是一个临时密钥,仅用于本次会话,提供了前向保密性(Perfect Forward Secrecy)。 |
数字签名 (Digital Signature)
| 字段 | 值 | 解释 |
|---|---|---|
Signature Algorithm |
ecdsa_secp256r1_sha256 (0x0403) |
作用: 签名算法标识符。这指定了用于签名Server Key Exchange参数的算法组合:ECDSA: 椭圆曲线数字签名算法secp256r1: 使用P-256椭圆曲线SHA256: 使用SHA-256哈希算法安全性: 这是一个现代的、高安全性的签名算法组合,提供了128位等效安全强度。 |
Signature Length |
72 |
作用: 数字签名的长度(字节)。对于ECDSA签名,长度通常在70-72字节之间,具体取决于签名值的编码。 |
Signature |
3046022100dfbadde013d056c36e31fde66d5264ced5644517fcd1e76509cc47e2cee911ee022100e370de96a9436421999be13c46ccf02629ed633ca6d747195e2df2e5baa47b66 |
作用: 服务器对密钥交换参数的数字签名。这是服务器使用其私钥对以下数据进行签名的结果:客户端随机数服务器随机数椭圆曲线参数服务器公钥ECDSA签名结构(ASN.1 DER编码):30: SEQUENCE标识符46: 序列长度(70字节)02 21 00: INTEGER,33字节长度dfbadde013d056c36e31fde66d5264ced5644517fcd1e76509cc47e2cee911ee: r值02 21 00: INTEGER,33字节长度e370de96a9436421999be13c46ccf02629ed633ca6d747195e2df2e5baa47b66: s值验证过程: 客户端会使用服务器证书中的公钥验证此签名,确保密钥交换参数的完整性和真实性。 |
7.6 Server Done
该包还有一个Server Hello Done 是TLS握手过程中服务器发送的最后一个消息,标志着服务器已完成其握手阶段的所有必要信息发送,现在等待客户端响应。
详细字段解释:
| 层级 | 字段名称 | 抓包中的值 | 详细解释 |
|---|---|---|---|
| 记录层 (Record Layer) | Content Type |
Handshake (22) |
作用 : 标识记录层帧内承载的数据类型 22 握手协议消息 与之前的握手消息保持一致 |
Version |
TLS 1.2 (0x0303) |
作用: 记录层协议版本标识 确认使用TLS 1.2进行通信 与握手协商的版本保持一致 | |
Length |
4 |
作用 : 指明后续握手协议消息的总长度 4字节 =握手消息头部长度 这是所有握手消息中最短的,因为消息体为空 只包含握手类型(1字节) + 长度字段(3字节) |
|
| 握手协议 (Handshake Protocol) | Handshake Type |
Server Hello Done (14) |
作用 : 明确握手消息的具体类型 14Server Hello Done消息 表示服务器已完成其握手阶段的所有消息发送 这是服务器在握手过程中发送的最后一个消息 |
Length |
0 |
作用 : 指明消息体的长0字节 Server Hello Done是一个空消息,仅起到信号作用 |
7.7 Client Key Exchange
查看下一个数据包,Client Key Exchange 是TLS握手过程中客户端发送的秘钥切换消息
详细字段解释:
| 层级 | 字段名称 | 抓包中的值 | 详细解释 |
|---|---|---|---|
| **** 记录层 (Record Layer) | Content Type |
Handshake (22) |
作用 : 标识记录层帧内承载的数据类型22 握手协议消息 与其他握手消息保持一致 确保消息在正确的协议层处理 |
Version |
TLS 1.2 (0x0303) |
作用: 记录层协议版本标识 TLS 1.2版本 与握手协商的版本保持一致确保版本兼容性 | |
Length |
70 |
作用 : 指明后续握手协议消息的总长度70字节 = 握手消息头部(4字节) + 椭圆曲线参数(66字节)包含完整的Client Key Exchange消息内容 |
|
| 握手协议 (Handshake Protocol) | Handshake Type |
Client Key Exchange (16) |
作用 : 明确握手消息的具体类型16 (0x10) = Client Key Exchange消息表示客户端发送其密钥交换参数这是客户端在ECDHE密钥交换中的关键消息 |
Length |
66 |
作用 : 指明消息体的长度66字节 = 公钥长度字段(1字节) + 椭圆曲线公钥(65字节)3字节长度字段,值为66 |
椭圆曲线Diffie-Hellman客户端参数
| 字段名称 | 抓包中的值 | 字节长度 | 详细解释 |
|---|---|---|---|
Pubkey Length |
65 |
1字节 | 作用 : 指明客户端椭圆曲线公钥的字节长度65字节 = secp256r1曲线未压缩格式的标准长度结构:1字节格式标识符 + 32字节X坐标 + 32字节Y坐标 |
Pubkey |
04428309c756a80a551053924c0030fab1d30622f05071ba19a0a8050a1f395def019c32ca7b68e757d21066bc7c71c833be252005c4c488463a39ec5749bc38ce |
65字节 | 作用 : 客户端的椭圆曲线公钥格式标识符 : 04 (未压缩点格式)X坐标 : 428309c756a80a551053924c0030fab1d30622f05071ba19a0a8050a1f395def (32字节)Y坐标 : 019c32ca7b68e757d21066bc7c71c833be252005c4c488463a39ec5749bc38ce (32字节)这是客户端为本次会话生成的临时密钥对的公钥部分 |
7.8 Change Cipher Spec
查看下一个数据包,客户端从明文通信切换到加密通信

详细字段解释:
| 层级 | 字段名称 | 抓包中的值 | 详细解释 |
|---|---|---|---|
| **** 记录层 (Record Layer) | Content Type |
Change Cipher Spec (20) |
作用 : 标识这是Change Cipher Spec协议消息20 (0x14) = Change Cipher Spec协议这是一个独立的协议类型,不属于握手协议用于通知协议状态转换 |
Version |
TLS 1.2 (0x0303) |
作用 : 记录层协议版本0x0303 = TLS 1.2版本与整个握手过程的版本保持一致 |
|
Length |
1 |
作用 : 消息内容长度1字节 = 固定长度Change Cipher Spec消息始终只有1字节内容 |
|
| 协议内容 | Change Cipher Spec Message |
作用: 表示"激活待处理的加密状态"发送后立即切换到新的加密参数 |
7.8 Encrypted Handshake Message
还是这个数据包,这个消息通常是Finished消息,包含对整个握手过程的验证,使用刚刚协商好的对称加密密钥进行加密

详细字段解释:
| 层级 | 字段名称 | 抓包中的值 | 详细解释 |
|---|---|---|---|
| **** 记录层 (Record Layer) | Content Type |
Handshake (22) |
作用 : 标识这是握手协议消息22 (0x16) = 握手协议但内容已经被加密,无法直接解析 |
Version |
TLS 1.2 (0x0303) |
作用: 记录层协议版本继续使用TLS 1.2版本标识 | |
Length |
40 |
作用 : 加密后握手消息的总长度40字节 = 加密后的Finished消息长度包含了认证标签和填充(如果有) |
|
| 加密内容 | Handshake Protocol: Encrypted Handshake Message |
[加密数据] |
作用: 加密后的握手消息通常是Finished消息使用协商好的对称加密算法包含握手过程的完整性验证 |
7.9 Finish
继续看下一个数据包,有三个消息。
这三个消息展示了TLS握手的完整结束过程,特别是包含了会话票据(Session Ticket)机制:
- New Session Ticket - 服务器发送会话票据供将来快速重连
- Change Cipher Spec - 服务器通知切换到加密状态
- Encrypted Handshake Message - 服务器发送加密的Finished消息

7.3 总结
接下来,总结一下 访问example.com的完整TLS抓包过程分析。
- 握手初始化
| 步骤 | TLS消息类型 | 内容类型 | 方向 | 主要内容 |
|---|---|---|---|---|
| 1 | Client Hello | Handshake (22) | 客户端 → 服务器 | • TLS版本支持 • 随机数 • 支持的加密套件 • 扩展信息 |
| 2 | Server Hello | Handshake (22) | 服务器 → 客户端 | • 选择的TLS版本 • 服务器随机数 • 选择的加密套件 • 会话ID • 扩展 |
- 服务器身份验证
| 步骤 | TLS消息类型 | 内容类型 | 方向 | 主要内容 |
|---|---|---|---|---|
| 3 | Certificate | Handshake (22) | 服务器 → 客户端 | • 服务器证书链 • 公钥信息 • 证书颁发机构信息 |
| 4 | Certificate Status | Handshake (22) | 服务器 → 客户端 | • OSCP装订 |
- 秘钥交换
| 步骤 | TLS消息类型 | 内容类型 | 方向 | 主要内容 |
|---|---|---|---|---|
| 5 | Server Key Exchange | Handshake (22) | 服务器 → 客户端 | • 密钥交换参数 • 数字签名 |
| 6 | Server Hello Done | Handshake (22) | 服务器 → 客户端 | 握手消息结束标志 |
- 客户端 密钥交换
| 步骤 | TLS消息类型 | 内容类型 | 方向 | 主要内容 |
|---|---|---|---|---|
| 7 | Client Key Exchange | Handshake (22) | 客户端 → 服务器 | • 预主密钥 • 用服务器公钥加密 |
| 8 | Change Cipher Spec | Change Cipher Spec (20) | 客户端 → 服务器 | 启用加密通信 |
| 9 | Client Finished | Handshake (22) | 客户端 → 服务器 | • 握手消息摘要 • 已加密 |
| 10 | Server Finished | Handshake (22) | 服务器 → 客户端 | • 握手消息摘要 • 已加密 |
8、TLS指纹技术
TLS指纹技术就像人类的指纹识别,通过分析TLS握手过程中的特征参数,为每个客户端或服务器生成独特的"指纹",用于识别、分类和追踪网络流量。
不同的TLS实现(如不同的操作系统、浏览器、应用程序)在构造TLS握手消息时会有微妙但一致的差异。这些差异包括:
- 支持的TLS版本顺序
- 加密套件的选择和排序
- 扩展字段的使用
- 握手消息的结构细节
8.1 TLS指纹特点
特点:
- **唯一标识:**基于TLS握手参数生成的哈希值
- **行为特征:**反映客户端/服务器的TLS实现特点
- **稳定性:**相同软件版本产生相同指纹
- **可识别性:**不同实现产生不同指纹
主要使用场景:
- **威胁检测:**识别恶意软件和攻击工具
- **流量分析:**分类和统计网络流量
- **设备识别:**识别IoT设备和操作系统
- **合规监控:**检测未授权的TLS客户端
8.2 TLS指纹分类
主要分为客户端指纹和服务端指纹
👤 客户端指纹
分析客户端发送的握手参数
如:JA3、JA3S
🖥️ 服务器指纹
分析服务器响应的握手参数
如:JARM、HASSH
🔄 双向指纹
结合客户端和服务器特征
如:JA3+JARM组合
📊 行为指纹
基于时序和行为模式
如:握手时序、重试模式
8.3 JA3指纹
JA3是最著名的TLS客户端指纹技术,由Salesforce开发,通过分析Client Hello消息中的关键参数生成指纹。
8.3.1 JA3指纹生成原理

比如上面抓包中的数据:
- TLS版本:1.2,十六进制(0x0303)-> 十进制(771)
- 加密套件:54个加密套件,对应十进制(
49195-49196-49286-49287-49161-49187-49162-49188-49266-49267-49324-49325-49160-49199-49200-49290-49291-49171-49191-49172-49192-49270-49271-49170-156-157-49274-49275-47-60-53-61-65-186-132-192-49308-49309-10-158-159-49276-49277-51-103-57-107-69-190-136-196-49310-49311-22) - 扩展:10个,对应十进制(
23-22-5-0-65281-35-10-11-13-16) - 椭圆曲线: supported groups值,5个,对应十进制(
23-24-25-21-19) - 椭圆曲线点格式:ec_point_formats,对应值0
最终的完整的字符串:771,49195-49196-49286-49287-49161-49187-49162-49188-49266-49267-49324-49325-49160-49199-49200-49290-49291-49171-49191-49172-49192-49270-49271-49170-156-157-49274-49275-47-60-53-61-65-186-132-192-49308-49309-10-158-159-49276-49277-51-103-57-107-69-190-136-196-49310-49311-22,23-22-5-0-65281-35-10-11-13-16,23-24-25-21-19,0
然后MD5:ec2e8760003621ca668b5f03e616cd57
8.3.2 JA3常见客户端指纹
| 客户端 | JA3指纹 | 特征描述 |
|---|---|---|
| Chrome 91 | a0e9f5d64349fb13191bc781f81f42e1` | 支持TLS 1.3,GREASE扩展 |
| Firefox 89 | b32309a26951912be7dba376398abc3b` | 不同的扩展顺序和椭圆曲线 |
| Safari 14 | e7d705a3286e19ea42f587b344ee6865` | macOS特有的TLS实现 |
访问这个网站https://tls.browserleaks.com/json可以查看自己的客户端ja3指纹
8.4 JA4指纹
JA4是新一代TLS客户端指纹技术,旨在解决JA3的局限性,提供更稳定、更准确的指纹识别能力。
8.4.1 JA4和JA3对比
📊 JA3的局限性
**顺序敏感:**参数顺序变化导致指纹变化
**GREASE影响:**Chrome的GREASE值影响稳定性
**版本混淆:**不同TLS版本可能产生相同指纹
**扩展干扰:**新扩展影响现有指纹
**哈希碰撞:**MD5哈希可能产生碰撞
🚀 JA4的改进
**顺序无关:**对参数进行排序处理
**GREASE过滤:**自动过滤GREASE值
**版本明确:**明确区分TLS版本
**扩展标准化:**标准化扩展处理
**更强哈希:**使用SHA-256哈希
8.4.2 JA4指纹生成原理
JA4指纹格式:JA4 = [TLS版本][SNI][加密套件数量][扩展数量][ALPN][加密套件哈希][扩展_签名哈希]
🔢 TLS版本
- t10: TLS 1.0
- t11: TLS 1.1
- t12: TLS 1.2
- t13: TLS 1.3
🌐 SNI标志
- d: 有SNI扩展
- i: 无SNI扩展
🔐 套件数量
- 十六进制表示
- 过滤GREASE值
- 最大值为99
🔧 扩展数量
- 十六进制表示
- 过滤GREASE值
- 最大值为99
📡 ALPN协议
- h1: HTTP/1.1
- h2: HTTP/2
- h3: HTTP/3
- 00: 无ALPN
加密套件
- 使用`,分隔不同字段(忽略 GREASE 值)
- 从小到大的排序
- sha256哈希
- 取前12位
扩展+签名哈希
- 忽略 GREASE 值,这里使用的是 Extensions-Type 值的十六进制格式(不含`0x)
- 从小到大的排序,作为第一部分
- 第二部分取 signature_algorithms(签名算法) 的值,同样使用`,作为分隔符,默认排序
- 两部分使用_组合
- sha256哈希
- 取前12位
还是以上面的抓包数据为例:
- TLS版本:1.2->tls12
- SNI: 有SNI扩展 -> d
- 套件数量:54
- 扩展数量:10
- ALPN协议:使用的http/1.1 -> h1
- 加密套件哈希:54个,从小到大排序
000a,0016,002f,0033,0035,0039,003c,003d,0041,0045,0067,006b,0084,0088,009c,009d,009e,009f,00ba,00be,00c0,00c4,c008,c009,c00a,c012,c013,c014,c023,c024,c027,c028,c02b,c02c,c02f,c030,c072,c073,c076,c077,c07a,c07b,c07c,c07d,c086,c087,c08a,c08b,c09c,c09d,c09e,c09f,c0ac,c0ad,sha256哈希a499d9840d024975ad9ee15ecda792b83bddf943ea00369015f60f601252e729,取前12位->a499d9840d2 - 扩展哈希:10个,从小到大排序
0005,000a,000b,000d,0016,0017,0023,ff01,算法签名10个0401,0403,0501,0503,0601,0603,0301,0303,0201,020,两部分组合0005,000a,000b,000d,0016,0017,0023,ff01_0401,0403,0501,0503,0601,0603,0301,0303,0201,0203,sha256哈希7448b1316cd7966aa8c0f082b7e2059633a4d2fe409abc3e0ee3bb38b0a6da8a,取前12位->7448b1316cd7
完整字符串组合:t12d5410h1_000a,0016,002f,0033,0035,0039,003c,003d,0041,0045,0067,006b,0084,0088,009c,009d,009e,009f,00ba,00be,00c0,00c4,c008,c009,c00a,c012,c013,c014,c023,c024,c027,c028,c02b,c02c,c02f,c030,c072,c073,c076,c077,c07a,c07b,c07c,c07d,c086,c087,c08a,c08b,c09c,c09d,c09e,c09f,c0ac,c0ad_0005,000a,000b,000d,0016,0017,0023,ff01_0401,0403,0501,0503,0601,0603,0301,0303,0201,0203
哈希后生成的ja4指纹t12d5410h1_a499d9840d2_7448b1316cd7
8.4.3 JA4指纹家族
👤 JA4 (客户端)
- **分析对象:**Client Hello消息
- **用途:**客户端应用识别
- **特点:**稳定性高,抗GREASE
t13d1516h2_8daaf6152771_02713d6af862
🖥️ JA4S (服务器)
- **分析对象:**Server Hello消息
- **用途:**服务器软件识别
- **特点:**精确的服务器指纹
t130200_1301_a56c586f8bb7
🔒 JA4H (HTTP)
- **分析对象:**HTTP请求头
- **用途:**HTTP客户端识别
- **特点:**应用层指纹
ge11cn020000_9c87b0c4f8b2_cd8dafe26f7a
🌐 JA4L (轻量级)
- **分析对象:**简化的TLS参数
- **用途:**快速分类
- **特点:**计算开销小
t13d15_8daaf6152771
📊 JA4X (扩展)
- **分析对象:**X.509证书
- **用途:**证书指纹
- **特点:**证书特征识别
x509_sha256_a1b2c3d4e5f6
🔍 JA4T (时序)
- **分析对象:**握手时序
- **用途:**行为模式识别
- **特点:**时间特征分析
t_120_250_380_500
8.5 JA3S指纹
JA3S是JA3的服务器端对应技术,通过分析Server Hello消息生成服务器指纹,用于识别和分类TLS服务器。
8.5.1 JA3S指纹生成原理
JA3S = MD5(TLSVersion,CipherSuite,Extensions)
- TLS版本
- 服务器选择的TLS协议版本
- 加密套件
- 服务器选择的单个加密套件
- 扩展列表
- 服务器返回的扩展字段
我们还是分析上面抓包中的Server Hello包,查看下JA3S指纹
- TLS版本: 1.2 -> 10进制值:771
- 加密套件: 0xc02c -> 10进制值:49196
- 扩展列表:6个,分别是65281-0-11-35-5-16`
完整字符串:771,49196,65281-0-11-35-5-16
MD5哈希后:42ec7b1db61428bf1cc6e01b9ef02b04
8.5.2 JA3S应用场景
服务器识别
- 识别Web服务器类型
- 检测负载均衡器
- 发现CDN服务
- 识别代理服务器
🔍 威胁检测
- 发现恶意C2服务器
- 识别钓鱼网站
- 检测蜜罐服务器
- 发现僵尸网络
📊 资产发现
- 网络资产清点
- 服务版本识别
- 配置合规检查
- 漏洞评估辅助
🔒 安全监控
- 异常服务检测
- 未授权服务发现
- 配置变更监控
- 合规性验证
8.6 JARM指纹
JARM是Salesforce开发的主动TLS服务器指纹技术,通过发送多个特制的TLS握手请求来生成更精确的服务器指纹。
8.6.1 JARM 工作原理

8.6.2 应用场景
- 识别恶意软件: 很多恶意软件(如僵尸网络、C2远控工具)使用固定的代码库,因此它们的JA3指纹是相同的。安全设备可以维护一个已知恶意软件的JA3指纹库,用于检测和阻断恶意连接。
- 识别特定应用: 可以识别出特定版本的浏览器、cURL、Python脚本等。
- 威胁狩猎: 在大量的网络日志中,寻找异常或罕见的JA3指纹,可能意味着有新的攻击或恶意活动。
8.6.3 JARM vs JA3S对比
📊 JA3S特点
- **被动检测:**只分析现有流量
- **单次握手:**基于一次握手生成指纹
- **简单快速:**计算开销小
- **隐蔽性好:**不产生额外流量
JA3S示例: ec74a5c51106f0419184d0dd08fb05bc (32字符MD5哈希)
🎯 JARM特点
- **主动探测:**主动发送探测包
- **多次握手:**基于10次不同握手
- **精确度高:**能区分细微差异
- **信息丰富:**包含更多服务器特征
JARM示例: 2ad2ad0002ad2ad00042d42d00000ad9b05a6a0b5a6a0b5a6a0b5a6a0b5a6a0b (62字符模糊哈希)
8.7 常见指纹规避
随着TLS指纹技术的广泛应用,攻击者也开发了各种规避和对抗技术来逃避检测。
🎭 指纹伪装
- **参数模拟:**模拟合法客户端的TLS参数
- **随机化:**随机改变扩展顺序
- **库替换:**使用不同的TLS库
- **版本伪装:**伪装成不同的软件版本
-
指纹伪装示例 # 原始Cobalt Strike指纹 a0e9f5d64349fb13191bc781f81f42e1 # 伪装后的指纹 b32309a26951912be7dba376398abc3b
🔄 动态变化
- **轮换指纹:**定期更换TLS配置
- **多样化:**使用多种不同的指纹
- **时间变化:**根据时间改变行为
- **环境适应:**根据目标环境调整
-
动态指纹轮换 Session 1: a0e9f5d64349fb13191bc781f81f42e1 Session 2: b32309a26951912be7dba376398abc3b Session 3: 51c64c77e60f3980eea90869b68c58a8
9、TLS调试工具
TLS调试工具就像医生的听诊器,帮助我们"诊断"TLS连接的健康状况,发现配置问题、安全漏洞和性能瓶颈。
这里主要介绍一下两种常用的工具:本地工具openssl和在线工具SSL Labs`
9.1 openssl
OpenSSL是最重要的TLS调试工具,提供了丰富的命令行功能来测试、分析和调试TLS连接。
9.1.1 基本连接
bash
openssl s_client -connect example.com:443
指定tls版本
bash
openssl s_client -connect example.com:443 -tls1_2
openssl s_client -connect example.com:443 -tls1_3
验证证书
bash
openssl s_client -connect example.com:443 -verify 5
9.1.2 高级连接
指定sni
bash
openssl s_client -connect example.com:443 -servername example.com
指定ALPN
bash
openssl s_client -connect example.com:443 -alpn h2,http/1.1
客户端证书认证
bash
openssl s_client -connect example.com:443 -cert client.crt -key client.key
指定CA证书
bash
openssl s_client -connect example.com:443 -CAfile ca-bundle.crt
禁用证书验证
bash
openssl s_client -connect example.com:443 -verify_return_error
详细调试信息
bash
openssl s_client -connect example.com:443 -debug
显示状态信息
bash
openssl s_client -connect example.com:443 -state
显示消息内容
bash
openssl s_client -connect example.com:443 -msg
安静模式
bash
openssl s_client -connect example.com:443 -quiet
9.1.3 加密套件测试
测试特定加密套件
bash
openssl s_client -connect example.com:443 -cipher 'ECDHE-RSA-AES256-GCM-SHA384'
测试TLS 1.3加密套件
bash
openssl s_client -connect example.com:443 -ciphersuites 'TLS_AES_256_GCM_SHA384'
列出支持的加密套件
bash
openssl ciphers -v 'ALL'
openssl ciphers -v 'HIGH'
openssl ciphers -v 'ECDHE'
测试弱加密套件
bash
openssl s_client -connect example.com:443 -cipher 'DES-CBC3-SHA'
9.1.4 证书测试
获取服务器证书
bash
echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -text
查看证书基本信息
bash
echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -subject -issuer -dates
查看证书指纹
bash
echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -fingerprint -sha256
查看证书公钥
bash
echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -pubkey
验证证书链
bash
openssl verify -CAfile ca-bundle.crt server.crt
检查证书和私钥匹配
bash
openssl x509 -noout -modulus -in server.crt | openssl md5 openssl rsa -noout -modulus -in server.key | openssl md5
检查CSR和私钥匹配
bash
openssl req -noout -modulus -in server.csr | openssl md5 openssl rsa -noout -modulus -in server.key | openssl md5
检查证书过期时间
bash
openssl x509 -noout -dates -in server.crt
9.1.5 性能测试
测试所有算法性能
bash
openssl speed
测试特定算法
bash
openssl speed aes-256-gcm
openssl speed rsa2048
openssl speed ecdsa
openssl speed ecdh
测试不同数据块大小
bash
openssl speed -bytes 1024 aes-256-gcm
openssl speed -bytes 8192 aes-256-gcm
多线程测试
bash
openssl speed -multi 4 aes-256-gcm
测试时间控制
bash
openssl speed -seconds 10 aes-256-gcm
测试TLS握手时间
bash
time openssl s_client -connect example.com:443 < /dev/null
9.2 SSL Labs
SSL Labs是Qualys提供的免费在线TLS配置测试平台,提供全面的TLS安全评估和详细的分析报告。
10 总结
由于篇幅有限,这里就先不过多写了,后面有机会在写,先挖个坑。
TLS知识体系非常强大,靠一两篇文章是无法理解透彻的,需要多看多实践,所有的知识体系学习基本都是这样。本文我们从TLS的基础概念出发,深入探索了协议架构、握手流程、加密套件、数字证书、指纹技术和调试工具,基本构建了完整的SSL/TLS知识体系,有了个宏观的概念理解。
安全之路,永无止境。SSL/TLS协议是现代网络安全的基石,正确理解和应用这些技术, 不仅能保护我们的数据安全,更能为构建更安全的网络世界贡献力量。