Skip to content
Wireshark Wiki 中文翻译整理专题首页原始页面

TLS

Transport Layer Security (TLS) 为两台主机之间的通信提供完整性、身份认证和保密性。在 Wireshark 中,本页主要用于识别 TLS 流量、理解 TLS/SSL 命名差异,以及配置 TLS 解密。

常见使用场景:

  • 查看 HTTPS、HTTP/2、SMTP STARTTLS、MQTT over TLS 等加密会话的握手与记录层信息。
  • 在合法获得会话密钥、PSK 或服务器私钥的前提下,让 Wireshark 解密 TLS 载荷。
  • 排查证书、协议版本、密码套件、重组设置或密钥日志配置问题。

不要混淆:

名称在本页中的含义排查时注意
TLS当前使用的传输层安全协议Wireshark 3.0 起 dissector 名称从 SSL 改为 TLS。
SSLTLS 的前身,也常被软件历史性地用来指代 TLSSSLv2/SSLv3 配置不安全;看到 “SSL certificate” 不代表流量一定是 SSL 协议。
STARTTLS先明文建立连接,再在同一端口升级到 TLS不等同于“直接使用 TLS 的端口”。
Key log file浏览器、curl 或底层 TLS 库导出的每会话密钥日志最通用的 TLS 解密方式,适用于含 DH/(EC)DHE 的会话。
RSA private key与服务器证书匹配的私钥不适用于 TLS 1.3,也不适用于使用 (EC)DHE 或会话恢复的多数场景。

协议依赖关系

通常,TLS 使用 TCP 作为传输协议。DTLS 基于 TLS 标准但运行在 UDP 之上。QUIC 使用 TLS 进行加密,但不是“普通 TCP 上的 TLS”。

Wireshark 中的 TLS 解析

TLS dissector 功能完整;在提供合适密钥材料时,可以解密 TLS。自 Wireshark 3.0 起,dissector 名称已从 SSL 重命名为 TLS。继续使用 ssl 显示过滤器会收到警告。

仅显示 TLS 流量:

text
tls

查看已解密出的 HTTP 或 HTTP/2:

text
tls and (http or http2)

抓包时不能直接用捕获过滤器匹配 TLS 协议;如果知道端口,可以按端口过滤,例如 HTTPS 默认端口:

text
tcp port 443

TLS 解密方式怎么选

Wireshark 支持三类 TLS 解密方式:

方法适合什么时候用主要限制
Key log file / (Pre)-Master-Secret log能控制客户端、服务端或应用启动环境,且应用支持导出密钥日志必须在会话建立时持续写入密钥;密钥日志需要妥善保护。
RSA private key旧式 RSA 密钥交换、未使用 (EC)DHE、未恢复会话,并且有服务器私钥不适用于 TLS 1.3;不适用于客户端证书或 CA 证书;现代站点通常不可用。
Pre-Shared-Key (PSK)嵌入式设备、IoT 或少量使用 TLS-PSK 的场景需要已知 PSK;同一 PSK 可能解密过去和未来使用该密钥的流量。

通常优先使用 key log file。RSA private key 只适合少数旧式握手;它的优点是配置一次即可用于匹配的会话,但限制很多。

首选项设置

打开 Edit -> Preferences -> Protocols -> TLS。也可以在 packet list 中选中 TLS packet,在 packet details 的 TLS 层上右键,通过 Protocol preferences 进入相关设置。

常用 TLS 首选项:

首选项用途
(Pre)-Master-Secret log filename / tls.keylog_file指向 key log file,用于 TLS 解密。
RSA keys list旧式 RSA 私钥配置入口,已弃用;建议改用 Preferences -> RSA Keys
Pre-Shared-Key以十六进制配置 PSK cipher suites 的解密密钥。
TLS debug file / tls.debug_logfile写入 TLS 解密过程细节,便于诊断解密失败;文件可能包含敏感密钥材料。

TLS 解密还依赖 TCP 重组设置:

  • Allow subdissector to reassemble TCP streams:默认启用。
  • Reassemble out-of-order segments:自 Wireshark 3.0 起默认禁用;乱序较多时可能影响解密或上层解析。

从 Wireshark 3.0 开始,RSA key 可在 Edit -> Preferences -> RSA Keys 中配置。RSA key 文件可以是 PEM 格式私钥,也可以是 PKCS#12 keystore(常见扩展名为 .pfx.p12)。如需改变已解密数据的上层协议,可在 TLS packet 上右键,使用 Decode As 修改 TLS 端口的 Current protocol

任务示例

用浏览器 key log file 解密 TLS

  1. 完全关闭浏览器。
  2. SSLKEYLOGFILE 环境变量设置为一个可写文件的绝对路径。
  3. 启动浏览器,并确认该文件被创建。
  4. 在 Wireshark 中打开 Edit -> Preferences -> Protocols -> TLS,把 (Pre)-Master-Secret log filename 指向该文件。
  5. 开始抓包并访问目标站点。
  6. 用下面的显示过滤器检查是否已看到解密后的 HTTP/HTTP2:
text
tls and (http or http2)

Windows 批处理示例:

text
@echo off
set SSLKEYLOGFILE=%USERPROFILE%\Desktop\keylogfile.txt
start firefox

Linux 示例:

text
export SSLKEYLOGFILE=$HOME/Desktop/keylogfile.txt
firefox

macOS 示例:

text
export SSLKEYLOGFILE=$HOME/Desktop/keylogfile.txt
open -a firefox

可按需把 firefox 替换为支持该机制的 Chrome。原页指出,2019 年时 Safari、旧 Microsoft Edge 等使用的 TLS 库不支持这种机制;基于 Chromium 的 Edge 79+ 应可使用。

导出当前抓包实际使用的 TLS 会话密钥

Wireshark 可通过 Export TLS Session Keys 对话框导出解密密钥。截至 Wireshark 4.2,该对话框导出的 secrets file 只包含当前 packets 实际引用的密钥。

将解密密钥嵌入 pcapng

自 Wireshark 3.0 起,可以把 TLS key log file 嵌入 pcapng,便于分发带有解密密钥的抓包文件,也避免在不同抓包之间反复修改 TLS 首选项。

text
editcap --inject-secrets tls,keys.txt in.pcap out-dsb.pcapng

dsb 后缀代表 Decryption Secrets Block (DSB),它是 pcapng 规范的一部分。key log file 可能包含与抓包无关的密钥;共享文件前应过滤不需要的密钥,避免泄露其他会话。

使用 Pre-Shared-Key

如果设备使用 TLS-PSK,且你可以获得 PSK,可在 TLS 的 Pre-Shared-Key 首选项中以十六进制格式配置它。由于 PSK 通常不会变化,同一个 PSK 可能解密过去和未来所有使用该密钥的流量。

示例抓包文件

原页提到的示例包括:

相关页面

外部链接

于 2020-08-11 23:26:41 UTC 从 https://wiki.wireshark.org/TLS 导入

原始页面图片

250718_TLS_prefs
250718_TLS_prefs

相关 Wireshark Wiki 页面

网络分析技术档案