Skip to content

TLS/SSL 解密

1. 什么是 keylog_file

keylog_file 是一个关键日志文件,包含了 TLS/SSL 会话的密钥信息。这个文件使得网络分析工具能够解密加密的 HTTPS 流量,从而进行深入的协议分析。

2. keylog_file 文件格式

keylog_file 包含了各种类型的密钥材料,每行格式如下:

text
# TLS 1.2 密钥格式
CLIENT_RANDOM <client_random> <master_secret>

# TLS 1.3 密钥格式
CLIENT_HANDSHAKE_TRAFFIC_SECRET <client_random> <secret>
SERVER_HANDSHAKE_TRAFFIC_SECRET <client_random> <secret>
CLIENT_TRAFFIC_SECRET_0 <client_random> <secret>
SERVER_TRAFFIC_SECRET_0 <client_random> <secret>

3. 生成 keylog_file

方法一:浏览器环境变量

bash
# Chrome/Firefox 导出密钥日志
export SSLKEYLOGFILE=/path/to/sslkeys.log
google-chrome --ssl-key-log-file=/path/to/sslkeys.log

# 或者在启动前设置环境变量
export SSLKEYLOGFILE=/tmp/sslkeys.log
firefox

方法二:应用程序配置

python
import ssl
import os

# 设置 SSL 密钥日志文件
os.environ['SSLKEYLOGFILE'] = '/tmp/sslkeys.log'

# 创建支持密钥日志的 SSL 上下文
context = ssl.create_default_context()
context.keylog_filename = '/tmp/sslkeys.log'
javascript
// 设置环境变量
process.env.SSLKEYLOGFILE = "/tmp/sslkeys.log";

const https = require("https");
const fs = require("fs");

// Node.js 会自动写入密钥日志
const options = {
  hostname: "example.com",
  port: 443,
  path: "/api",
  method: "GET",
};
bash
# 使用 OpenSSL 连接并生成密钥日志
export SSLKEYLOGFILE=/tmp/sslkeys.log
openssl s_client -connect example.com:443 -keylogfile /tmp/sslkeys.log

4. Tshark 中使用 keylog_file

基础解密命令

bash
# 使用密钥文件解密 HTTPS 流量
tshark -r encrypted.pcap -o "tls.keylog_file:sslkeys.log" -Y "http"

# 输出解密后的 HTTP 内容为 JSON
tshark -r encrypted.pcap -o "tls.keylog_file:sslkeys.log" -T json -Y "http" > decrypted.json

# 提取解密后的 HTTP 请求
tshark -r encrypted.pcap -o "tls.keylog_file:sslkeys.log" -Y "http.request" -T fields -e http.request.method -e http.request.uri -e http.request.full_uri

高级解密分析

bash
# 分析解密后的 HTTP 响应状态
tshark -r encrypted.pcap -o "tls.keylog_file:sslkeys.log" -Y "http.response" -T fields -e frame.time -e ip.src -e http.response.code -e http.response.phrase

# 提取解密后的 HTTP 头部信息
tshark -r encrypted.pcap -o "tls.keylog_file:sslkeys.log" -Y "http" -T fields -e http.host -e http.user_agent -e http.cookie

# 导出解密后的 HTTP 对象
tshark -r encrypted.pcap -o "tls.keylog_file:sslkeys.log" --export-objects http,./decrypted_objects/

5. 实际业务场景示例

场景一:API 调试

bash
# 捕获并解密 API 调用
tshark -i eth0 -f "host api.example.com and port 443" -w api_capture.pcap

# 分析解密后的 API 请求和响应
tshark -r api_capture.pcap -o "tls.keylog_file:browser_keys.log" -Y "http and json" -V

场景二:Web 应用性能分析

bash
# 分析页面加载时间
tshark -r web_traffic.pcap -o "tls.keylog_file:sslkeys.log" -Y "http" -T fields -e tcp.stream -e frame.time -e http.request.uri -e http.response.code -e http.time

# 统计不同资源类型的加载情况
tshark -r web_traffic.pcap -o "tls.keylog_file:sslkeys.log" -Y "http" -T fields -e http.request.uri -e http.content_type -e frame.len

场景三:安全分析

bash
# 检查解密后的敏感数据传输
tshark -r secure_app.pcap -o "tls.keylog_file:app_keys.log" -Y "http and (http.request.method == POST or http.request.method == PUT)" -T fields -e http.request.uri -e http.file_data

# 分析认证流程
tshark -r auth_flow.pcap -o "tls.keylog_file:sslkeys.log" -Y "http and (http.authorization or http.cookie)" -V

6. TLS 解密工作流程

7. keylog_file 最佳实践

IMPORTANT

安全注意事项

  • keylog_file 包含敏感的加密密钥信息
  • 仅在受控环境中使用,避免在生产环境泄露
  • 使用完毕后应安全删除密钥文件

TIP

性能优化建议

  • 大型 pcap 文件解密可能消耗大量内存
  • 使用显示过滤器减少处理的数据量
  • 考虑分批处理大型捕获文件

WARNING

兼容性说明

  • 不同 TLS 版本的密钥格式不同
  • 确保 keylog_file 与捕获的流量版本匹配
  • 某些加密套件可能不支持密钥导出

8. 故障排除

常见问题

bash
# 检查密钥文件格式是否正确
head -n 5 sslkeys.log

# 验证 Tshark 是否正确加载密钥文件
tshark -r test.pcap -o "tls.keylog_file:sslkeys.log" -Y "tls" -T fields -e tls.handshake.type

# 检查是否有匹配的 TLS 会话
tshark -r test.pcap -o "tls.keylog_file:sslkeys.log" -Y "http" -c 1

调试步骤

  1. 验证捕获文件:确认 pcap 文件包含完整的 TLS 握手
  2. 检查密钥文件:验证 keylog_file 包含相应会话的密钥
  3. 测试解密:使用简单的过滤器测试解密是否成功
  4. 分析输出:检查解密后的内容是否符合预期
Details

密钥文件示例内容

text
# TLS 1.2 会话密钥示例
CLIENT_RANDOM 52362c4e1f4c5a3b2d1e0f9c8b7a6958473625...
CLIENT_RANDOM 62472d5f2g5d6b4c3e2f1a0d9e8c7b6a5948372...

# TLS 1.3 会话密钥示例
CLIENT_HANDSHAKE_TRAFFIC_SECRET 52362c4e1f4c5a3b...
SERVER_HANDSHAKE_TRAFFIC_SECRET 52362c4e1f4c5a3b...
CLIENT_TRAFFIC_SECRET_0 52362c4e1f4c5a3b...
SERVER_TRAFFIC_SECRET_0 52362c4e1f4c5a3b...

通过正确使用 keylog_file,您可以将加密的 HTTPS 流量转换为可读的明文内容,大大提升网络分析和故障排除的效率。