Windows

如何在 Windows 中保護證書私鑰?

  • July 28, 2020

我正在嘗試在 Windows 10 中保護證書的私鑰,但看起來我誤解了“管理私鑰”的作用。

這是我遵循的過程:

編輯 - 今天早上我嘗試重複整個過程,現在我得到了預期的錯誤。請看下面我的回答。


  1. 啟動 powershell(作為管理員),創建一個自簽名證書並將其安裝在 localmachine 個人儲存中:
New-SelfSignedCertificate -DnsName test.pfx -CertStoreLocation "cert:\LocalMachine\My" -NotAfter (Get-Date).AddDays(7)
  1. certlm.msc
  2. 找到test.pfx證書,右鍵點擊它並選擇all tasks > manage private keys
  3. 從列表中刪除所有人,包括管理員,因此您會收到以下消息:“沒有組或使用者有權訪問此對象。但是,此對象的所有者可以分配權限。” 並點擊確定。
  4. 點兩下證書,轉到詳細資訊選項卡,從下拉列表中選擇“僅限屬性”,點擊指紋,然後將指紋複製並粘貼到記事本中
  5. 打開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();
           }
       }
   }
}
  1. 從記事本複制/粘貼指紋以替換程式碼
  2. 啟動程式碼

我期待 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

引用自:https://serverfault.com/questions/1026689