有沒有辦法以防止重複使用的方式“標記”密鑰?
假設我有一對與某些資源相關聯的公鑰和私鑰(例如,網站 mycoolsite.com 的 TLS 證書)。我可以自由地獲取這些密鑰並將它們重新用於不同的資源(例如,用於 anotherneatsite.net)。我的問題是:是否有一種有效的方法可以使用“此密鑰用於 mycoolsite.com”的數據“標記”原始密鑰,以便刪除標記會使密鑰失效?
這個想法是允許身份驗證系統拒絕公共密鑰,如果它被重新用於不同的帳戶。需要明確的是,這是關於公鑰加密系統的一般問題,而不僅僅是 TLS。
我的問題是:是否有一種有效的方法可以使用“此密鑰用於 mycoolsite.com”的數據“標記”原始密鑰,以便刪除標記會使密鑰失效?
是的,這基本上就是證書的作用,您可以在 X500 樣式的 RDN(相對可分辨名稱)中擁有一個域名。也可能有(關鍵)擴展,其中包含附加數據,例如主題替代名稱或密鑰用法。“關鍵”意味著即使副檔名未知,也不應忽略副檔名。所有這些數據都由頒發證書的 CA 簽名,並且必須由驗證者進行驗證。
當然,即使是證書驗證過程中的 MUST 也可以忽略。不可能使密鑰本身無效,並且您不能強制系統忽略從外部發送給它的數據(除非您將系統沙箱化)。
也不可能禁止使用者複製公鑰或在其他地方請求證書。有時,特定的 CA 會在他們簽署的證書中保留密鑰的 ID。在這種情況下,CA可以選擇忽略帶有“舊”密鑰的證書請求——儘管根據我的經驗,這更多是為了避免系統內的錯誤。
最後,不能限制私鑰的使用。RSA 私鑰的持有者可以使用該密鑰進行簽名或建立密鑰,即使證書資訊另有說明。證書只是說明密鑰對可以用於什麼,但由接收、驗證和信任證書的一方來強制執行。
一種方法是:
- 客戶端生成私鑰和公鑰。
- 客戶端向伺服器發送公鑰。
- 伺服器從客戶端的公鑰和隨機 nonce 生成派生密鑰。
- 伺服器將 nonce 發送回客戶端,客戶端可以使用它來創建派生私鑰。
這樣,客戶端和伺服器都為密鑰貢獻了隨機性,因此客戶端不能自行選擇質量差或重複使用的密鑰。同時,伺服器永遠不知道私鑰。
如何執行第 3 步取決於所使用的算法。這個問題的答案中有一些例子。