如何使用單獨的密鑰進行簽名和加密
我讀到不應將相同的密鑰用於證書籤名和加密。
我想知道這是否不是 PKI/TLS/SSL 的問題,原因是非對稱加密用於傳輸公鑰(通過證書)。公鑰用於加密瀏覽器生成的會話密鑰。會話密鑰用於對實際流量進行對稱加密。
這就是它的工作原理嗎?這是否意味著可以使用相同的密鑰對兩者進行簽名?
我將如何使用單獨的鍵?
在 TLS 1.2 中,客戶端提出了他們願意用於 TLS 的原語套件列表。這在 ClientHello 消息中清楚地發生。
您可以檢查該列表並決定以下三件事之一:
- 該列表有一個很好的現代 Forward Secret Diffie-Hellman 風格的密鑰協商方法,您可以輕鬆地使用 RSA 簽名。您為 RSA 密鑰 #1 提供證書 #1,並使用相應的私鑰在 TLS 中籤名。證書 #1 表示此 RSA 密鑰適用於此目的(特別是它應該設置密鑰使用位 0 數字簽名)。
- 清單上說客戶願意做 RSA 密鑰協議。您為 RSA 密鑰 #2 提供證書 #2,並使用相應的私鑰解密來自客戶端的密鑰協議消息。證書 #2 表示此 RSA 密鑰適用於此目的,但不適用於簽名(可能設置密鑰用法的第 2 位,即 keyEncipherment - 它絕對不應該設置第 0 位數字簽名)。
或者 3. 你不能接受這些方法中的任何一種而放棄。
選擇了這種行為方式後,您現在也可以使用 TLS 1.3,您應該始終使用證書 #1(和相應的密鑰),因為在 TLS 1.3 中沒有 RSA 密鑰協商機制,因為它被認為是危險的。因為您使用的是單獨的密鑰,所以謹慎驗證密鑰使用資訊的客戶端可以辨識出它不應該信任TLS 1.3 中的證書 #2(或在 TLS 1.2 中進行 DH 密鑰協議),因此如果在場景中對您的解密進行攻擊上面的 #2 是成功的,那些客戶受到保護,只有願意自己經歷場景 #2 的客戶才會受到影響。
首先,您不能使用私鑰進行簽名和加密,而是將其用於簽名和解密。
在 PKI/TLS/SSL 中,當使用 RSA 會話密鑰協議時,不使用非對稱加密來傳輸公鑰。公鑰在(簽名的)證書中,私鑰保留在伺服器上。
一旦受信任,公鑰就可以用來加密主密鑰,主密鑰用於派生會話密鑰。
這就是它的工作原理嗎?這是否意味著可以使用相同的密鑰對兩者進行簽名?
所以不,這不是它的使用方式。也就是說,有時在 TLS中使用相同的私鑰進行簽名或解密。當在啟用的密碼套件中同時使用非對稱 (DH) 密鑰協議和 RSA 加密時,就會發生這種情況。在 DH 密鑰協議中,私鑰驗證參數,而不是直接解密主密鑰。
儘管就密鑰管理而言,將密鑰的不同用途分開是一種很好的做法。然而,這並不意味著使用密鑰進行身份驗證和解密會突然破壞所有安全性。使用不同的密鑰進行例如長期簽名(例如文件簽名)和實時身份驗證非常有意義。
要使用不同的密鑰對,通常使用不同的證書/證書鏈就足夠了。(TLS)軟體應該選擇正確的密鑰使用,因此不應該將證書/私鑰對用於錯誤的目的——但這當然是特定於實現的。換句話說,不要假設而是測試您特定的 TLS 配置。