Ich habe eine ASP.NET-Anwendung, die auf den privaten Schlüssel in einem Zertifikat im Zertifikatsspeicher zugreift. Unter Windows Server 2003 konnte ich winhttpcertcfg.exe verwenden, um dem NETWORK SERVICE-Konto privaten Schlüsselzugriff zu gewähren. Wie erstelle ich Berechtigungen für den Zugriff auf einen privaten Schlüssel in einem Zertifikat im Zertifikatspeicher (Lokaler Computer \ Personal) auf einem Windows Server 2008 R2 in einer IIS 7.5-Website?Wie kann ASP.NET auf einen privaten Schlüssel in einem Zertifikat im Zertifikatspeicher zugreifen?
Ich habe versucht, Vollzugriff auf "Jeder", "IIS AppPool \ DefaultAppPool", "IIS_IUSRS" und jedes andere Sicherheitskonto, das ich mit dem MMC-Zertifikat (Server 2008 R2) finden konnte. 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 löst stattdessen jedes Mal einen Fehler aus, wenn auf die Eigenschaft des privaten Schlüssels 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" " 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>
</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";
}
}
Für mich Fehler aktivieren, nur OK, wenn der Benutzer im Server protokolliert. http://stackoverflow.com/questions/2774382/iis-6-private-key-certificate-access/2817702#2817702 – Kiquenet
So konfigurieren Sie ("XXX" zu vollständigen Vertrauen auf Zertifikat in "Lokaler Computer \ Personal") in Windows Server 2008 R2? run/mmc/file/hinzufügen Snap-in/Zertifikate und ??? Danke – Cobaia
Wenn Sie MMC-Zertifikate für den lokalen Computer \ Personal geöffnet haben, klicken Sie auf das "Zertifikat", um die Zertifikate anzuzeigen. (Hinweis: Im Folgenden wird davon ausgegangen, dass das Zertifikat bereits importiert wurde. Wenn nicht, importieren Sie das Zertifikat zuerst). Klicken Sie mit der rechten Maustaste auf das Zertifikat, dem Sie die vollständige Kontrolle erteilen möchten. Klicken Sie im Kontextmenü auf "Alle Aufgaben", klicken Sie dann im Untermenü auf "Private Schlüssel verwalten". Von dort können Sie alle Benutzer hinzufügen, die Zugriff auf den privaten Schlüssel für das Zertifikat erhalten möchten. – thames