如何在 Windows 中保护证书私钥?

如何在 Windows 中保护证书私钥?

我正在尝试在 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,最近修改的私钥“文件”的权限符合预期(即任何人都无权访问)。

答案1

我今天早上尝试重复整个过程,现在我得到了预期的错误。但是,如果我使用昨天的证书指纹,我仍然不会得到错误,尽管它们在 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-could-lead-to-a-security-breach?forum=winserversecurity

相关内容