2 回答

TA貢獻2036條經(jīng)驗 獲得超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,那些參數(shù)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內(nèi)容
> 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 設(shè)置為/keypath/grpc-key.txt,Preferences -> Protocols -> TLS -> (Pre)-Master-Secret log filename現(xiàn)在 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,您會發(fā)現(xiàn)內(nèi)容可能是CLIENT_RANDOM xxxxxx yyyyyyyy.

TA貢獻1772條經(jīng)驗 獲得超5個贊
我弄明白了。有兩個問題:
雖然Wireshark 中一些關(guān)于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
我開始捕獲的時間太晚了(因為我在等待將秘密寫入文件以便能夠?qū)⑺鼈兲峁┙o Wireshark),因此 Wireshark 缺少初始 TLS 握手,這導致錯誤識別協(xié)議為 TLS 1.2 而不是 1.3 以及無法解密流量。正確的處理方法是在 TLS 協(xié)商開始之前開始捕獲,然后在創(chuàng)建機密文件后向 Wireshark 提供機密文件。(這可能需要保存并重新加載捕獲。)
Wireshark 現(xiàn)在成功解密了 TLS 數(shù)據(jù);可以通過選擇“加密的應用程序數(shù)據(jù)”然后單擊窗口底部的“解密的 TLS”選項卡來查看它。
- 2 回答
- 0 關(guān)注
- 271 瀏覽
添加回答
舉報