本地计算机中的“受信任根证书”证书的PrivateKey信任权限

7

我有一个证书需要导入到证书/受信任的根证书颁发机构并且具有相应的私钥。

为了从代码中实际访问密钥,您需要将私钥权限设置为授予特定的 IIS 应用程序池完全访问权限。我完全理解这一点,但问题是只能在个人证书上设置,而不是受信任的根证书。

我尝试将相同的证书添加到“个人”存储中,以下代码不会中断:

X509Store store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);

foreach (X509Certificate2 cert in store.Certificates)
{
    if (cert.HasPrivateKey)
    {
        // access private key here
    }
}

store.Close();

在个人存储中设置证书权限只需要将StoreName.Root更改为StoreName.My即可实现。在那里,我能够访问它。但是我无法在根目录下访问它。它只会显示:密钥集不存在。您有什么建议吗?
附加信息:
如果我将应用程序池标识设置为本地系统(它对我的计算机具有完全权限),我可以成功访问私钥。因此,主要问题是如何设置应用程序池标识的权限,以便可以访问受信任根存储中证书的私钥。
为什么信任根存储而不是个人存储?我有一个预构建的程序集,访问特定存储中的证书,所以简单地将证书放入个人存储中对我来说行不通。这就是为什么必须在受信任的根证书的私钥上设置信任权限的原因。
3个回答

8
我尚未尝试过在受信任的根证书颁发机构中使用此方法,但是我发现在其他证书存储中最简单的方法是将证书拖放到个人存储区,然后设置权限,然后再将其拖放回原始证书存储区。在您的情况下,这是受信任的根证书颁发机构。
使用证书 MMC 的步骤:
1. 将证书导入到所需存储区并标记密钥可导出。(您可能可以跳过此步骤直接导入到个人存储区,但我没有尝试过。) 2. 将已导入的证书拖放到个人存储区。 3. 在个人存储区中右键单击证书,在上下文菜单中单击“所有任务”,然后在子菜单中单击“管理私钥”。根据您的应用程序池参考第 1 步,设置适当的权限。 4. 设置权限后,将证书拖放回原始存储区(在您的情况下是受信任的根证书颁发机构)。

1
+1 这是一个非常有趣的方法。并且为了确认您的过程,它也适用于受信任的根存储库。拖动、设置、拖动,完成了。太棒了! - Robert Koritnik
@RobertKoritnik:那样解决了你的问题吗? - thames
当然可以。我在之前的评论中确认过了。它也可以与受信任的根存储一起使用。运作正常。很简单。 - Robert Koritnik
在Win2003服务器上,我无法像提到的那样从个人/证书/<cert>的证书存储中获取“管理私钥”。有人遇到过这种情况吗? - sonjz
1
@sonjz - 我假设你在使用Windows 2003?如果是这样,你需要使用winhttpcertcfg.exe来授予私钥访问权限给NETWORK SERVICE账户(或需要权限的账户)。步骤3中上述链接适用于Windows 2008 R2(在R1中也可能可以使用)。 - thames
@thames - 谢谢,我们安装了“Microsoft WSE 2.0”,并使用“X509证书工具”在正确的存储库中定位了证书,然后我们只需更改文件的权限即可。我将为寻找此解决方案的人创建另一个答案。 - sonjz

4

解决方案

在个人证书存储之外设置信任权限是可能的,但您无法通过MMC设置权限。至少不能直接在存储上设置。接受的答案展示了一种简化的方法,通过移动证书来实现相同的结果。

您必须按照以下方式执行...

获取工具

  1. 从Microsoft获取WF_WCF_Samples文件。这是一个自解压缩档案,但您不需要提取所有内容。所以...
  2. 使用任何归档工具打开该文件,只提取FindPrivateKey 解决方案/项目
  3. 在Visual Studio中打开并编译它。

查找您的私钥

  1. 打开MMC并添加证书快捷方式。确保在添加它时选择计算机和本地计算机。

  2. 选择具有您的私钥证书的存储区。

  3. 打开私钥并复制其Thumbprint

  4. 打开命令提示符,并导航到编译FindPrivateKey工具的文件夹

  5. 输入此命令

    FindPrivateKey YourStoreName LocalMachine -t "ThumbprintWithSpaces" -a
    例如:
    FindPrivateKey Root LocalMachine -t "83 45 22 ..." -a

  6. 复制文件以及路径(它可能横跨两行,因此请将其复制到记事本并连接)

授予证书信任

  1. 打开命令提示符并输入:

    icacls "FullPathOfYourPrivateKey" /grant:r "UserFQDN":f
    例如:
    icacls "c:\ProgramData..." /grant:r "IIS AppPool\ASP.NET v4.0":f

  2. 完成。

这将向您的用户(在上面的示例中是应用程序池标识)授予证书私钥完全信任,以便您可以使用该密钥签署数据或执行任何需要的操作。

如果您不想获得完全权限,则可以轻松更改冒号后面的最后一部分。它可以具有许多不同的设置,因此我建议您检查icacls命令帮助


使用MMC浏览证书,我的证书可以在个人/证书中找到。如何找到YourStoreName的正确值? - Rui Marques
@ruionwriting:我不明白你的问题。你能否请重新用别的方式表达一下? - Robert Koritnik
个人证书的适当“YourStoreName”是什么? - Rui Marques
1
就是这样了,就是这样了!感谢Robert K。(关于为IIS应用程序添加读取权限解决Windows 2003服务器问题的解决方案。上帝保佑命令行) - sonjz

3
如果您正在使用Windows Server 2003,您会注意到在证书下没有“管理私钥”任务。如果您在计算机上安装了Microsoft WSE 2.0,那么您可以使用一个名为X509证书工具的工具。只需搜索您的证书,它很可能在本地计算机/个人存储区中(或应该在其中)。请注意:如果您将证书放在当前用户/个人存储区中(通常是默认设置),则只能由当前登录的用户访问,这意味着如果您希望您的Web服务器访问它,则必须更改AppPool的权限。您应该很容易地改变私钥的权限,默认情况下,Web服务器上的AppPool将使用NETWORK SERVICE来运行您的Web应用程序。因此,只需将NETWORK SERVICE添加到安全性中,默认情况下它将设置读取和读取/执行权限,这足以让您的BouncyCastle等读取私钥以签署您的文档。希望这能帮助到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接