2 回答
TA贡献2036条经验 获得超8个赞
根本原因是和之间的差异tls1.2
,tls1.3
差异可以在这里找到
每个 golang tls 代码
keyLogLabelTLS12 = "CLIENT_RANDOM"
keyLogLabelClientHandshake = "CLIENT_HANDSHAKE_TRAFFIC_SECRET"
keyLogLabelServerHandshake = "SERVER_HANDSHAKE_TRAFFIC_SECRET"
keyLogLabelClientTraffic = "CLIENT_TRAFFIC_SECRET_0"
keyLogLabelServerTraffic = "SERVER_TRAFFIC_SECRET_0"
对于tls1.3,那些参数CLIENT_HANDSHAKE_TRAFFIC_SECRET、SERVER_HANDSHAKE_TRAFFIC_SECRET、CLIENT_TRAFFIC_SECRET_0和SERVER_TRAFFIC_SECRET_0 可以导出为客户端机密
对于tls1.2,CLIENT_RANDOM可以导出为客户端机密
所有这些都可以在 Wireshark 中用于解密 TLS1.2 和 TLS 1.3。
这是一个测试样本
首先,启动一个HTTPS服务器
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
if req.URL.Path != "/" {
http.NotFound(w, req)
return
}
})
w, err := os.OpenFile("/keypath/https-key.txt", os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)
if err != nil {
fmt.Printf("failed to open file err %+v", err)
return
}
cs := make([]uint16, len(cipherSuites))
copy(cs, cipherSuites)
var tlsCfg tls.Config
tlsCfg.Certificates = make([]tls.Certificate, 1)
tlsCfg.Certificates[0], err = tls.LoadX509KeyPair(*certFile, *keyFile)
tlsCfg.NextProtos = []string{"h2"}
tlsCfg.ClientAuth = tls.RequestClientCert
tlsCfg.SessionTicketsDisabled = true
tlsCfg.InsecureSkipVerify = true
tlsCfg.KeyLogWriter = w
tlsCfg.MinVersion = tls.VersionTLS13
tlsCfg.CipherSuites = cs
tlsCfg.PreferServerCipherSuites = true
srv := &http.Server{
Addr: *addr,
Handler: mux,
TLSConfig: &tlsCfg,
}
log.Printf("Starting server on %s", *addr)
err = srv.ListenAndServeTLS("", "")
log.Fatal(err)
curl然后,通过tls1.3 curl -Lv https://localhost:4000 --cacert /crtpath/ca.crt --tlsv1.3
我们可以找到如下https-key.txt内容
> cat https-key.txt
CLIENT_HANDSHAKE_TRAFFIC_SECRET xxxx yyyyy
SERVER_HANDSHAKE_TRAFFIC_SECRET xxxx yyyyyyyyy
CLIENT_TRAFFIC_SECRET_0 xxxxxxx yyyy
SERVER_TRAFFIC_SECRET_0 xx yyyyyyyyyyyy
然后在 WireShark 中将 keyFile 设置为/keypath/grpc-key.txt,Preferences -> Protocols -> TLS -> (Pre)-Master-Secret log filename现在 Wireshark 可以进行 TLS 解密
对于 TLS1.2 测试,您可以将服务器代码更改为tlsCfg.MinVersion = tls.VersionTLS12,然后curl通过tls1.2 curl -Lv https://localhost:4000 --cacert /crtpath/ca.crt --tlsv1.2. 再次检查https-key.txt,您会发现内容可能是CLIENT_RANDOM xxxxxx yyyyyyyy.
TA贡献1772条经验 获得超5个赞
我弄明白了。有两个问题:
虽然Wireshark 中一些关于TLS 解密的讨论提到
CLIENT_RANDOM
,但这仅适用于 TLS 1.2;当前的 Syncthing 一般使用 TLS 1.3,这涉及到我看到的其他秘密(、、、和CLIENT_HANDSHAKE_TRAFFIC_SECRET
)——参见NSS Key Log Format 的官方文档。SERVER_HANDSHAKE_TRAFFIC_SECRET
CLIENT_TRAFFIC_SECRET_0
SERVER_TRAFFIC_SECRET_0
我开始捕获的时间太晚了(因为我在等待将秘密写入文件以便能够将它们提供给 Wireshark),因此 Wireshark 缺少初始 TLS 握手,这导致错误识别协议为 TLS 1.2 而不是 1.3 以及无法解密流量。正确的处理方法是在 TLS 协商开始之前开始捕获,然后在创建机密文件后向 Wireshark 提供机密文件。(这可能需要保存并重新加载捕获。)
Wireshark 现在成功解密了 TLS 数据;可以通过选择“加密的应用程序数据”然后单击窗口底部的“解密的 TLS”选项卡来查看它。
- 2 回答
- 0 关注
- 242 浏览
添加回答
举报