使用 openssl 命令列工具解密 SSL 流量

使用 openssl 命令列工具解密 SSL 流量

我正在嘗試使用openssl命令列工具進行一些手動資料提取/加密/解密。

我一直在審查 RFC5246 以找出我需要做什麼。我不清楚是否能夠使用該工具完成這一步。我假設解釋中的私鑰是我創建自簽名憑證時產生的私鑰。

當RSA用於伺服器驗證和金鑰交換時,用戶端會產生48位元組的pre_master_secret,並使用伺服器的公鑰進行加密,然後傳送到伺服器。伺服器使用其私鑰來解密 pre_master_secret。然後雙方將 pre_master_secret 轉換為 master_secret,如上圖所示。

有人可以告訴我我的假設是否正確。是否可以openssl使用命令列工具並提供我的伺服器私鑰和來自客戶端的加密 pre_master_secret 來為伺服器產生 pre_master 金鑰,以便可以使用它來建立主金鑰?

如果是這樣,我不知道該怎麼做,因為我對工具不太熟悉。

我應該指出的另一件事是,我正在使用的密碼套件是 TLS_RSA_WITH_AES_256_CBC_SHA,我可以在 Wireshark 中看到來自客戶端的 pre_master_secret 長度為 256 位元組。

答案1

我不完全確定,但我認為答案是否定的。命令openssl列客戶端是異質工具的集合。 X.509 指令對於操作憑證很有用,但加密指令除了測試 OpenSSL 本身之外幾乎沒有什麼用處。

如果您需要使用常見演算法進行密碼計算,我推薦使用Python互動式命令列隱圓頂圖書館.

但要解密 SSL 連接,最簡單的方法通常是使用 Wireshark。告訴 Wireshark 在哪裡可以找到私鑰它將解密使用 RSA 加密的 TLS 連線。對於使用臨時 Diffie-Hellman 的連接,您無法僅使用金鑰解密流量,您需要來自客戶端或伺服器的附加訊息


請注意,由於以下幾個原因,使用TLS_RSA_WITH_AES_256_CBC_SHA密碼套件是一個壞主意:

  • 它沒有前向保密,因此如果伺服器的私鑰洩露,則使用該密鑰建立的所有連接也會洩露。使用 Diffie-Hellman 金鑰交換(名稱中帶有 EDH 或 ECDHE)的密碼套件具有前向保密性。
  • 它使用 RSA 解密,其中涉及填充,這是實現錯誤和透過側通道洩漏的典型來源。除了 RSA 之外,名稱中帶有 EDH 或 ECDHE 的密碼套件,或者帶有 DSA 或 ECDSA 的密碼套件,使用簽名而不是解密,並且不太可能出現實現缺陷。
  • 它使用 CBC 解密,其中涉及填充,這是實現錯誤和透過側通道洩漏的典型來源。名稱中沒有 CBC 的密碼套件不太可能出現實施缺陷。

答案2

SSL/TLS-through-1.2 plain-RSA keyexchange 所使用的 RSAES-PKCS1v1_5 可以透過 OpenSSL 命令列操作進行解密rsautl或者pkeyutl(後者自 2010 年 1.1.0 起)。請參閱各自的手冊頁,如果您的系統不是 Windows,則應該可以使用這些手冊頁,或者在線的

請注意,這為您提供了預主金鑰,它本身無法解密(或驗證)流量。您必須使用預主金鑰加隨機數來衍生主金鑰,然後使用主金鑰加隨機數來衍生工作金鑰(複數)。 SSLv3(不再使用)、TLS 1.0 和 1.1(RFC 2246 和 4346)以及 TLS 1.2(RFC 5246)之間的衍生函數「PRF」有所不同。 (PRF 在 TLS 1.3 中將再次有所不同,但這也將完全消除普通 RSA 金鑰交換。)

命令列無法直接存取 SSL/TLS PRF,但可以執行建置它們的 HMAC(SSLv3 除外);請參閱dgst與上面相同位置的手冊頁,並注意-hmac $key只能處理可以從 shell/etc 傳遞的位元組序列,這不是全部,因此您可能需要-mac hmac -macopt hexkey:$hexkey改為。

也就是說,我同意 Gilles 的觀點,讓wireshark 來做這件事要容易得多。如果您的問題是您擁有除捕獲文件之外的某種形式的數據,wireshark 發行版附帶了幾個輔助命令行工具,用於操作通常可以構造假捕獲的文件,在這種情況下,wireshark 或tshark main 可以解密。

相關內容