Wie kann ASP.NET Zugriff auf einen privaten Schlüssel in einem Zertifikat im Zertifikatspeicher gewähren?
Ich habe eine ASP.NET-Anwendung, die auf den privaten Schlüssel in einem Zertifikat im Zertifikatspeicher zugreift. Unter Windows Server 2003 konnte ich mit winhttpcertcfg.exe privaten Schlüsselzugriff auf das NETWORK SERVICE-Konto gewähren. Wie erteile ich Berechtigungen für den Zugriff auf einen privaten Schlüssel in einem Zertifikat im Zertifikatspeicher (Lokaler Computer \ Personal) unter Windows Server 2008 R2 auf einer IIS 7.5-Website?
Ich habe versucht, "Jeder", "IIS AppPool \ DefaultAppPool", "IIS_IUSRS" und jedem anderen Sicherheitskonto, das ich mithilfe der MMC "Zertifikate" (Server 2008 R2) finden konnte, vollständigen Vertrauenszugriff zu gewähren. Der folgende Code zeigt jedoch, dass der Code keinen Zugriff auf den privaten Schlüssel eines Zertifikats hat, das mit dem privaten Schlüssel importiert wurde. Der Code wird stattdessen jedes Mal ausgelöst, wenn auf die Eigenschaft "Privater Schlüssel" zugegriffen wird.
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" "<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" rel="nofollow">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</a>">
<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>
</ItemTemplate>
<FooterTemplate>
</table></FooterTemplate>
</asp:Repeater>
</div>
</form>
</body>
</html>
Default.aspx.cs
using System;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Web.UI;
public partial class _Default : Page
{
public X509Certificate2Collection Certificates;
protected void Page_Load(object sender, EventArgs e)
{
// Local Computer\Personal
var store = new X509Store(StoreLocation.LocalMachine);
// create and open store for read-only access
store.Open(OpenFlags.ReadOnly);
Certificates = store.Certificates;
repeater1.DataSource = Certificates;
repeater1.DataBind();
}
}
public static class Extensions
{
public static string HasPublicKeyAccess(this X509Certificate2 cert)
{
try
{
AsymmetricAlgorithm algorithm = cert.PublicKey.Key;
}
catch (Exception ex)
{
return "No";
}
return "Yes";
}
public static string HasPrivateKeyAccess(this X509Certificate2 cert)
{
try
{
string algorithm = cert.PrivateKey.KeyExchangeAlgorithm;
}
catch (Exception ex)
{
return "No";
}
return "Yes";
}
}