Golang解密后量子TLS流量进行调试

Golang解密后量子TLS流量进行调试 在 go1.24.2 中引入了一个新的密钥交换算法 X25519MLKEM768。但是当我尝试使用 KeyLogWriter 输出 tls_key.log 文件时,我将日志文件导入 Wireshark,它却无法解密 TLS 流量。那么,我应该使用什么工具来解密后量子(PQ)TLS 流量呢?以下是我的 tls.Config 设置:

func createTLSConfig(cert tls.Certificate) *tls.Config {
    keyLogFile, err := os.OpenFile("tls_keys.log", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)
    if err != nil {
        log.Fatalf("error: %v", err)
    }

    return &tls.Config{
        Certificates: []tls.Certificate{cert},
        MinVersion:   tls.VersionTLS13,
        MaxVersion:   tls.VersionTLS13,
        CurvePreferences: []tls.CurveID{tls.X25519MLKEM768},
        KeyLogWriter: keyLogFile, 
    }
}

更多关于Golang解密后量子TLS流量进行调试的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

你好,

你遇到这个问题是因为 Wireshark 目前不支持解密使用后量子(PQ)混合密钥交换机制(例如 X25519MLKEM768)的 TLS 1.3 流量。该机制是在 Go 1.24.2 版本中添加的,属于正在进行的 PQ-TLS1.3 实验的一部分。

为什么 Wireshark 无法解密 PQ-TLS KeyLogWriter 输出的是标准 NSS 风格的 TLS 密钥,但 Wireshark 期望的是它能理解的密钥交换算法,而它目前不支持像 X25519MLKEM768 这样的混合 PQ 算法。因此,即使提供了正确的 tls_keys.log 文件,Wireshark 也无法使用它来解密流量,因为它无法识别密钥派生流程。

此致 最佳狗狗翻译应用

更多关于Golang解密后量子TLS流量进行调试的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在 Go 1.24.2 中,X25519MLKEM768 这类后量子(PQ)混合密钥交换算法使用新的密钥导出机制,传统的 KeyLogWriter 输出的 NSS Key Log 格式(CLIENT_RANDOM)无法直接用于解密。你需要使用 Go 1.24 引入的 QUICKeyLogWriter 格式来捕获 PQ TLS 1.3 的密钥材料。

以下是修改后的示例代码,使用 tls.QUICKeyLogWriter

package main

import (
    "crypto/tls"
    "log"
    "os"
)

func createTLSConfig(cert tls.Certificate) *tls.Config {
    keyLogFile, err := os.OpenFile("tls_keys.log", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)
    if err != nil {
        log.Fatalf("error: %v", err)
    }

    return &tls.Config{
        Certificates: []tls.Certificate{cert},
        MinVersion:   tls.VersionTLS13,
        MaxVersion:   tls.VersionTLS13,
        CurvePreferences: []tls.CurveID{tls.X25519MLKEM768},
        KeyLogWriter: tls.QUICKeyLogWriter(keyLogFile), // 使用 QUIC 密钥日志格式
    }
}

生成的 tls_keys.log 文件将包含 QUIC 密钥日志格式的条目,例如:

SERVER_HANDSHAKE_TRAFFIC_SECRET 7a5b8c3d...
CLIENT_HANDSHAKE_TRAFFIC_SECRET 9d2e4f6a...

要使用 Wireshark 解密,需要:

  1. 在 Wireshark 中打开 TLS 流量捕获文件
  2. 进入 Edit → Preferences → Protocols → TLS
  3. (Pre)-Master-Secret log filename 中指定 tls_keys.log 文件路径
  4. 确保 Wireshark 版本为 4.2.0 或更高,以支持后量子混合密钥交换的解密

如果仍然无法解密,检查 Wireshark 是否识别了正确的密钥材料:

# 查看密钥日志文件内容
cat tls_keys.log
# 应包含 SERVER_HANDSHAKE_TRAFFIC_SECRET 和 CLIENT_HANDSHAKE_TRAFFIC_SECRET 条目

对于纯粹的调试目的,你还可以启用 Go 的 TLS 详细日志记录:

import (
    "crypto/tls"
    "log"
    "os"
)

func main() {
    // 启用 TLS 内部状态日志
    os.Setenv("GODEBUG", "tlskeylog=1")
    
    // 你的 TLS 配置和连接代码
}

这将输出额外的密钥信息到标准错误,帮助验证密钥交换过程是否按预期使用 X25519MLKEM768 算法。

回到顶部