如何在 Windows 中保護證書私鑰?
我正在嘗試在 Windows 10 中保護證書的私鑰,但看起來我誤解了“管理私鑰”的作用。
這是我遵循的過程:
編輯 - 今天早上我嘗試重複整個過程,現在我得到了預期的錯誤。請看下面我的回答。
- 啟動 powershell(作為管理員),創建一個自簽名證書並將其安裝在 localmachine 個人儲存中:
New-SelfSignedCertificate -DnsName test.pfx -CertStoreLocation "cert:\LocalMachine\My" -NotAfter (Get-Date).AddDays(7)
- 跑
certlm.msc
- 找到
test.pfx
證書,右鍵點擊它並選擇all tasks > manage private keys
- 從列表中刪除所有人,包括管理員,因此您會收到以下消息:“沒有組或使用者有權訪問此對象。但是,此對象的所有者可以分配權限。” 並點擊確定。
- 點兩下證書,轉到詳細資訊選項卡,從下拉列表中選擇“僅限屬性”,點擊指紋,然後將指紋複製並粘貼到記事本中
- 打開Visual Studio(作為普通使用者,而不是管理員,即不同的帳戶)並創建一個新的控制台應用程序,並輸入以下程式碼:
using System; using System.Security.Cryptography; using System.Security.Cryptography.X509Certificates; using System.Text; namespace ConsoleApp4 { class Program { static void Main(string[] args) { const string thumbprint = "<THUMBPRINT>"; using (var store = new X509Store(StoreName.My, StoreLocation.LocalMachine)) { store.Open(OpenFlags.ReadOnly); var certs = store.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, false); if (certs.Count != 1) throw new Exception("certificate count <> 1"); var cert = certs[0]; // why doesn't this fail? var privateKey = cert.GetRSAPrivateKey(); privateKey.Dispose(); } } } }
- 從記事本複制/粘貼指紋以替換程式碼
- 啟動程式碼
我期待 GetRSAPrivateKey() 失敗,但事實並非如此。(如果我添加更多程式碼,我也可以使用私鑰解密內容)。
我還查看了 %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\Keys 並且最近修改的私鑰“文件”的權限符合預期(即任何人都無法訪問)。
今天早上我嘗試重複整個過程,現在我得到了預期的錯誤。但是,如果我使用昨天的證書指紋,儘管它們在 certlm.msc 中的設置完全相同,但我仍然沒有收到任何錯誤
我隨後意識到(我的錯!)在之前的證書的情況下,我忘記了我在測試時已經導入了兩次,即使用上面的 powershell 命令創建 + 導入,允許使用者讀取,但隨後刪除並重新 -導入 pfx 文件。
因此,我發現當您從 certlm.msc 中刪除證書文件時,它不會刪除 %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\Keys 中的相關密鑰文件,並且如果使用者對前一個密鑰具有例如讀取權限文件,則使用者仍然可以訪問證書。同樣更新 certlm.msc 中的權限對之前的文件沒有影響。此外,更改舊密鑰文件的權限將影響證書的權限。所以大概有效權限結合了所有相關密鑰文件的所有現有權限,但我還沒有深入確認。
要點是 certlm.msc 顯示目前關聯的密鑰文件權限,而不是密鑰權限(由具有相同密鑰的所有密鑰文件建構)。
所以解決方法是從%ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\Keys 中刪除之前的相關密鑰文件。
我已經向 MS 提出了它,以防他們提供更多資訊: https ://social.technet.microsoft.com/Forums/en-US/27e7780e-c755-41bc-9d9f-f141ba842733/certlmmsc-private-key-permissions -are-misleading-and-coud-lead-to-a-security-breach?forum=winserversecurity