我有一个ASP.NET应用程序访问证书存储区中的证书中的私钥.在Windows Server 2003上,我能够使用winhttpcertcfg.exe来授予对NETWORK SERVICE帐户的私钥访问权限.如何授予访问IIS 7.5网站中Windows Server 2008 R2上的证书存储(本地计算机\个人)中的证书中的私钥的权限?
我尝试使用证书MMC(Server 2008 R2)为"Everyone","IIS AppPool\DefaultAppPool","IIS_IUSRS"以及我能找到的每个其他安全帐户提供完全信任访问权限.但是,下面的代码演示了代码无法访问使用私钥导入的证书的私钥.每次访问私钥属性时,代码都会抛出并抛出错误.
Default.aspx的
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Import Namespace="System.Security.Cryptography.X509Certificates" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Repeater ID="repeater1" runat="server">
<HeaderTemplate>
<table>
<tr>
<td>
Cert
</td>
<td>
Public Key
</td>
<td>
Private Key
</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<%#((X509Certificate2)Container.DataItem).GetNameInfo(X509NameType.SimpleName, false) %>
</td>
<td>
<%#((X509Certificate2)Container.DataItem).HasPublicKeyAccess() %>
</td>
<td>
<%#((X509Certificate2)Container.DataItem).HasPrivateKeyAccess() %>
</td>
</tr> …
在我的应用程序中,MY使用以下代码以编程方式将客户端身份验证证书添加到-Store:
//certData is a byte[]
//password is a SecureString
X509Certificate2 certificate = new X509Certificate2(certData, password, X509KeyStorageFlags.Exportable);
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
try
{
store.Open(OpenFlags.ReadWrite);
store.Add(certificate);
}
finally
{
store.Close();
}
Run Code Online (Sandbox Code Playgroud)
使用此代码,证书已MY在我测试的所有计算机上正确导入-Store(指纹和认证链也正确).
但是在某些计算机(Windows 7 Professional SP1和带有本地用户帐户的Widnows Server 2008 R2)上,证书之后可能不会用于客户端身份验证("无法为SSL/TLS安全通道建立信任关系").在具有域用户帐户的Windows 8.1 Enterprise计算机上,身份验证有时会起作用,但并非总是如此.
我绝望地尝试了几件事,最后找到了添加X509KeyStorageFlags.PersistKeySet存储标志的解决方案.所以第一行现在是:
X509Certificate2 certificate = new X509Certificate2(certData, password, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);
Run Code Online (Sandbox Code Playgroud)
使用这些标志,证书可以在所有设备上使用.即使我很高兴我的应用程序现在以预期的方式工作,我想了解原因?PersistKeySet-Flag究竟做了什么,为什么它会影响证书的使用时间和人员?
在这种情况下,MSDN不是很有用.