【问题标题】:PrivateKey trust permissions for local machine "Trusted roots" certificates本地计算机“受信任的根”证书的 PrivateKey 信任权限
【发布时间】:2012-05-21 18:14:30
【问题描述】:

我有一个必须导入到Certificates/Trusted Root Certification Authorities的证书,并且有一个对应的私钥。

要从代码中实际访问密钥,您需要设置私钥权限以授予对特定 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访问它。它只是说:

键集不存在

有什么建议吗?

附加信息

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

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

【问题讨论】:

    标签: windows-7 iis-7 certificate windows-server-2008-r2 private-key


    【解决方案1】:

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

    使用证书 MMC 的步骤:

    1. Import certificate to the store you want it and mark keys as exportable.(你或许可以绕过这个直接导入个人商店,但我没试过。)
    2. 将导入的证书拖放到个人商店。
    3. 右键单击个人存储中的证书,在上下文菜单中单击“所有任务”,然后在子菜单中单击“管理私钥”。根据您的应用程序池设置适当的权限为referenced in step 1
    4. 设置权限后,将证书拖放回原始存储(在您的情况下为受信任的根证书颁发机构)。

    【讨论】:

    • +1 这是一个非常有趣的方法。为了确认您的流程,它也适用于受信任的根存储。拖动,设置,拖动,你就完成了。太好了!
    • @RobertKoritnik:那解决了你的问题吗?
    • 是的,当然可以。我在之前的评论中确认了。它也适用于受信任的根存储。作品。很简单。
    • 在 win2003 服务器中,我没有从证书存储中获取个人/证书/ 的“管理私钥”,如上所述。有人遇到过吗?
    • @sonjz - 我假设您使用的是 Windows 2003?如果是这样,您需要使用 winhttpcertcfg.exe 授予对 NETWORK SERVICE 帐户(或需要权限的帐户)的私钥访问权限。步骤 3 中的上述链接适用于 Windows 2008 R2(也可以在 R1 中使用)。
    【解决方案2】:

    解决方案

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

    你必须这样做......

    获取工具

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

    找到你的私钥

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

    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.

    【讨论】:

    • 使用 MMC 浏览证书我的证书位于 @ Personal / Certificates。如何找到 YourStoreName 的正确值?
    • @ruionwriting:我不明白你的问题。你能改写一下吗?
    • 个人证书的正确“YourStoreName”是什么?
    • 就是这个,就是这个!感谢 Robert K.(回复:解决了为 IIS 应用程序添加读取权限以赢得 2003 服务器的问题。上帝保佑命令行)
    【解决方案3】:

    如果您使用的是 Windows Server 2003,您会注意到您的证书下没有 Manage Private Keys 任务。

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

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

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

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-02-24
      • 2019-02-26
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 1970-01-01
      • 2012-08-20
      相关资源
      最近更新 更多