Appearance
Appearance
Transport Layer Security (TLS) 为两台主机之间的通信提供完整性、身份认证和保密性。在 Wireshark 中,本页主要用于识别 TLS 流量、理解 TLS/SSL 命名差异,以及配置 TLS 解密。
常见使用场景:
不要混淆:
| 名称 | 在本页中的含义 | 排查时注意 |
|---|---|---|
| TLS | 当前使用的传输层安全协议 | Wireshark 3.0 起 dissector 名称从 SSL 改为 TLS。 |
| SSL | TLS 的前身,也常被软件历史性地用来指代 TLS | SSLv2/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”。
TLS dissector 功能完整;在提供合适密钥材料时,可以解密 TLS。自 Wireshark 3.0 起,dissector 名称已从 SSL 重命名为 TLS。继续使用 ssl 显示过滤器会收到警告。
仅显示 TLS 流量:
tls查看已解密出的 HTTP 或 HTTP/2:
tls and (http or http2)抓包时不能直接用捕获过滤器匹配 TLS 协议;如果知道端口,可以按端口过滤,例如 HTTPS 默认端口:
tcp port 443Wireshark 支持三类 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。
SSLKEYLOGFILE 环境变量设置为一个可写文件的绝对路径。Edit -> Preferences -> Protocols -> TLS,把 (Pre)-Master-Secret log filename 指向该文件。tls and (http or http2)Windows 批处理示例:
@echo off
set SSLKEYLOGFILE=%USERPROFILE%\Desktop\keylogfile.txt
start firefoxLinux 示例:
export SSLKEYLOGFILE=$HOME/Desktop/keylogfile.txt
firefoxmacOS 示例:
export SSLKEYLOGFILE=$HOME/Desktop/keylogfile.txt
open -a firefox可按需把 firefox 替换为支持该机制的 Chrome。原页指出,2019 年时 Safari、旧 Microsoft Edge 等使用的 TLS 库不支持这种机制;基于 Chromium 的 Edge 79+ 应可使用。
Wireshark 可通过 Export TLS Session Keys 对话框导出解密密钥。截至 Wireshark 4.2,该对话框导出的 secrets file 只包含当前 packets 实际引用的密钥。
自 Wireshark 3.0 起,可以把 TLS key log file 嵌入 pcapng,便于分发带有解密密钥的抓包文件,也避免在不同抓包之间反复修改 TLS 首选项。
editcap --inject-secrets tls,keys.txt in.pcap out-dsb.pcapngdsb 后缀代表 Decryption Secrets Block (DSB),它是 pcapng 规范的一部分。key log file 可能包含与抓包无关的密钥;共享文件前应过滤不需要的密钥,避免泄露其他会话。
如果设备使用 TLS-PSK,且你可以获得 PSK,可在 TLS 的 Pre-Shared-Key 首选项中以十六进制格式配置它。由于 PSK 通常不会变化,同一个 PSK 可能解密过去和未来所有使用该密钥的流量。
原页提到的示例包括:
SampleCaptures#SSL_with_decryption_keys。dump.pcapng:TLSv1.2 抓包,包含 73 个 cipher suites,需要 premaster.txt 解密。tls12-dsb.pcapng:嵌入了解密密钥的 TLS 1.2 trace。于 2020-08-11 23:26:41 UTC 从 https://wiki.wireshark.org/TLS 导入