Windows 7 “本地计算机的私钥信任权限”;“可信赖的根”;证书

Windows 7 “本地计算机的私钥信任权限”;“可信赖的根”;证书,windows-7,iis-7,certificate,windows-server-2008-r2,private-key,Windows 7,Iis 7,Certificate,Windows Server 2008 R2,Private Key,我有一个证书,必须导入到证书/受信任的根证书颁发机构中,并且具有相应的私钥 要从代码中实际访问密钥,需要设置私钥权限以授予对特定IIS应用程序池的完全访问权限。我完全理解这一点,但问题是,这只能在个人证书上设置,而不能在受信任的根证书上设置 我已尝试将同一证书添加到Personal store,但以下代码没有中断: X509Store store = new X509Store(StoreName.Root, StoreLocation.LocalMachine); store.Open(Ope

我有一个证书,必须导入到证书/受信任的根证书颁发机构中,并且具有相应的私钥

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

我已尝试将同一证书添加到Personal store,但以下代码没有中断:

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
,则在个人存储中设置证书的权限会起作用。我可以在那里找到它。但我无法在根目录中访问它。它只是说:

键集不存在

有什么建议吗

补充资料 如果我将我的应用程序池标识设置为本地系统(对我的计算机拥有总权限),我可以成功地访问私钥。因此,主要问题是如何设置应用程序池标识的权限,以便访问受信任根存储中证书的私钥

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

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

你必须这样做

获取工具
  • 从Microsoft获取文件。这是一个自解压存档,但您不需要提取所有内容。所以
  • 使用任何归档工具打开文件,仅提取FindPrivateKey解决方案/项目
  • 在VisualStudio中打开并编译它
  • 查找您的私钥
  • 打开MMC并添加证书管理单元。添加计算机时,请确保选择计算机和本地计算机

  • 选择具有私钥证书的存储

  • 打开私钥并复制其指纹

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

  • 输入此命令

    FindPrivateKey YourStoreName LocalMachine-t“ThumbprintWithSpaces”-a

    FindPrivateKey根本地计算机-t“83 45 22…”-a

  • 沿路径复制文件(它将跨越两行,因此复制到记事本并连接)

  • 授予证书信托
  • 打开命令提示符并输入:

    icacls“FullPathOfYourPrivateKey”/grant:r“UserFQDN”:f

    icacls“c:\ProgramData…”/grant:r“IIS应用程序池\ASP.NET v4.0”:f

  • 完成了

  • 这将向您的用户授予证书私钥完全信任(在我上面的例子中是它的应用程序池标识),因此您可以使用该密钥对数据进行签名或执行任何需要的操作


    如果不需要完全权限,可以轻松更改冒号后面的最后一部分。它可以有很多不同的设置,因此,我建议您检查icacls。

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

    使用MMC证书的步骤:

  • (您可能可以绕过此操作,直接导入到个人存储,但我还没有尝试。)
  • 将导入的证书拖放到个人存储
  • 右键单击个人存储中的证书,在上下文菜单中单击“所有任务”,然后在子菜单中单击“管理私钥”。根据您的应用程序池设置适当的权限
  • 设置权限后,将证书拖放回原始存储区(在您的情况下为受信任的根证书颁发机构)

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

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

    注意:如果您的证书位于当前用户/个人存储中(通常是默认设置),则只有当前登录的用户才能访问该证书,这意味着如果您希望您的Web服务器访问该证书,则必须更改对应用池的权限

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

    希望这有帮助


    +1这是一种非常有趣的方法。为了确认您的流程,它也适用于受信任的根存储。拖动,设置,拖动,就完成了。太好了@罗伯特科里特尼克:那么这解决了你的问题吗?是的,当然解决了。我在先前的评论中证实了这一点。它还可以与受信任的根存储一起使用。作品简单。在win2003服务器中,我没有从ce获取“管理私钥”