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。我可以在那里访问它。但是我无法以root访问它。它只是说:

键集不存在

有什么建议么?

附加信息

如果我将我的应用程序池身份设置为本地系统(对我的机器拥有全部权限),我可以成功访问私钥。所以主要问题是如何设置我的应用程序池身份的权限以访问受信任的根存储中证书的私钥。

为什么信任根存储而不是个人存储?
我有一个预先构建的程序集,可以在这个特定的商店中访问这个证书,所以简单地将证书放在个人商店中不会对我有用。这就是为什么必须在受信任的根证书的私钥上设置信任权限的原因。

4

3 回答 3

7

我没有尝试过使用受信任的根证书颁发机构,但我发现使用其他证书存储最简单的方法是将证书拖放到个人存储中,然后设置权限,然后拖放回原始证书存储。在您的情况下,受信任的根证书颁发机构。

使用证书 MMC 的步骤:

  1. 将证书导入您想要的商店并将密钥标记为可导出。(你也许可以绕过这个并直接导入到个人商店,但我没有尝试过。)
  2. 将导入的证书拖放到个人商店。
  3. 右键单击个人存储中的证书,然后在上下文菜单中单击“所有任务”,然后在子菜单中单击“管理私钥”。根据步骤 1中引用的应用程序池设置适当的权限。
  4. 设置权限后,将证书拖放回原始存储(在您的情况下为受信任的根证书颁发机构)。
于 2012-05-15T04:24:43.563 回答
4

解决方案

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

你必须这样做...

获取工具

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

找到你的私钥

  1. 打开 MMC 并添加证书管理单元。添加时请确保选择计算机和本地计算机。

  2. 选择拥有您的证书和私钥的商店。

  3. 打开私钥并复制其指纹

  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 command help

于 2012-05-14T15:19:56.583 回答
3

如果您使用的是Windows Server 2003 ,您会注意到您的证书下没有“管理私钥”任务。

如果您将Microsoft WSE 2.0安装到您的机器上,您可以使用一个名为X509 Certificate Tool的工具。只需搜索您的证书,它很可能在(或应该)在本地机器/个人商店中。

注意:如果您在当前用户/个人商店中有您的证书(这通常是默认设置),它只能由当前登录的用户访问,这意味着如果您希望您的网络服务器访问它,它不能无需更改对您的 AppPool 的权限。

您应该能够非常轻松地更改私钥的权限,默认情况下,您的 Web 服务器上的 AppPool 将使用NETWORK SERVICE来运行您的 Web 应用程序。因此,只需将 NETWORK SERVICE 添加到安全性,默认情况下它将设置读取和读取/执行权限,这足以让您的 BouncyCastle 等读取私钥,以便您签署文档。

希望这可以帮助。

在此处输入图像描述

于 2012-09-26T14:12:28.690 回答