我的证书必须导入证书/受信任的根证书颁发机构,并且有相应的私钥。
要从代码中实际访问密钥,您需要设置私钥权限以授予对特定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中访问它。它只是说:
键集不存在
有什么建议吗?
如果我将应用程序池标识设置为本地系统(对我的计算机具有完全权限),我可以成功访问私钥。因此,主要问题是如何设置应用程序池标识的权限以访问受信任的根存储中的证书的私钥。
为什么信任root商店而非个人?
我有一个预先构建的程序集,可以在这个特定的商店中访问此证书,因此只需将证书放在个人存储中就行不通。这就是为什么在受信任的根证书的私钥上设置信任权限是必要的。
答案 0 :(得分:7)
我没有尝试使用受信任的根证书颁发机构,但我发现与其他证书商店最简单的做法是将证书拖放到个人存储中,然后设置权限然后拖放回到原来的证书商店。在您的情况下,受信任的根证书颁发机构。
使用证书MMC的步骤:
答案 1 :(得分:4)
可以对个人证书存储中的证书以外的证书设置信任权限,但不能通过MMC设置权限。至少不是直接在商店那里。接受的答案显示了一种简化的方法,即移动证书以获得相同的结果。
你必须这样做......
输入此命令
FindPrivateKey YourStoreName LocalMachine -t“ThumbprintWithSpaces”-a
即
FindPrivateKey Root LocalMachine -t“83 45 22 ...” - a
将文件与路径一起复制(它将跨越两行,因此复制到记事本并连接)
打开命令提示符并输入:
icacls“FullPathOfYourPrivateKey”/ grant:r“UserFQDN”:f
即
icacls“c:\ ProgramData ...”/ grant:r“IIS AppPool \ ASP.NET v4.0”:f
完成。
这将为您的用户授予证书私钥完全信任(在我的情况下,它的应用程序池标识),因此您可以使用密钥对数据进行签名或执行您需要执行的任何操作。
如果您不想要完全权限,可以在冒号后轻松更改最后一部分。它可以有许多不同的设置,所以我建议您检查 icacls command help。
答案 2 :(得分:3)
如果您使用的是 Windows Server 2003 ,则会注意到您的证书下没有管理私钥任务。
如果您将 Microsoft WSE 2.0 安装到您的计算机上,则可以使用名为 X509证书工具的工具。只需搜索您的证书,就可能在(或应该)本地计算机/个人商店中搜索。
注意:如果您在当前用户/个人存储中拥有您的证书(通常是默认设置),则只有当前登录的用户才能访问该证书,这意味着如果您希望您的Web服务器访问它,那么无法更改AppPool的权限。
您应该可以非常轻松地更改私钥的权限,默认情况下,您的网络服务器上的AppPool将使用 NETWORK SERVICE 来运行您的Web应用程序。因此,只需将NETWORK SERVICE添加到安全性中,默认情况下,它将设置读取和读取/执行权限,这足以让您的BouncyCastle等读取私钥,以便您可以对文档进行签名。 / p>
希望这有帮助。