Ich habe eine ASP.NET-Anwendung, die auf den privaten Schlüssel in einem Zertifikat im Zertifikatspeicher zugreift. Unter Windows Server 2003 konnte ich winhttpcertcfg.exe verwenden, um privaten Schlüsseln Zugriff auf das NETWORK SERVICE-Konto zu gewähren. Wie erteile 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 auf einer IIS 7.5-Website?
Ich habe versucht, "Jeder", "IIS AppPool \ DefaultAppPool", "IIS_IUSRS" und jedem anderen Sicherheitskonto, das ich mithilfe der Zertifikats-MMC (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 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";
}
}
quelle
IIS_IUSRS
Hinweis zum Erteilen von Berechtigungen über MMC, Zertifikate, Zertifikat auswählen, Rechtsklick, Alle Aufgaben, "Private Schlüssel verwalten"
Private Keys verwalten steht nur in der Menüliste für Personal ... Wenn Sie also Ihr Zertifikat in Trusted People usw. abgelegt haben, haben Sie kein Glück.
Wir haben einen Weg gefunden, der für uns funktioniert hat. Ziehen Sie das Zertifikat per Drag & Drop auf Persönlich und führen Sie die Option Private Schlüssel verwalten aus, um Berechtigungen zu erteilen. Denken Sie daran, die Verwendung von integrierten Objekttypen festzulegen und die Domäne nicht auf dem lokalen Computer zu verwenden. Wir haben dem DefaultAppPool-Benutzer Rechte gewährt und dabei belassen.
Wenn Sie fertig sind, ziehen Sie das Zertifikat per Drag & Drop zurück, wo immer Sie es ursprünglich hatten. Presto.
quelle
winhttpcertcfg
Wenn Sie versuchen, ein Zertifikat aus einer PFX-Datei in IIS zu laden, ist die Lösung möglicherweise so einfach wie das Aktivieren dieser Option für die
Application Pool
.Klicken Sie mit der rechten Maustaste auf den App-Pool und wählen Sie
Advanced Settings
.Dann aktivieren
Load User Profile
quelle
Ich habe herausgefunden, wie das in Powershell geht, nach dem jemand gefragt hat:
quelle
Für mich war es nichts anderes als das erneute Importieren des Zertifikats mit aktiviertem Kontrollkästchen "Exportieren des privaten Schlüssels zulassen".
Ich denke, es ist notwendig, aber es macht mich nervös, da es sich um eine Drittanbieter-App handelt, die auf dieses Zertifikat zugreift.
quelle
Ergänzend zu den Antworten ist dies eine Anleitung , um den privaten Schlüssel des Zertifikats zu finden und die Berechtigungen hinzuzufügen.
Dies ist die Anleitung zum Abrufen von FindPrivateKey.exe im Handbuch zum Suchen des privaten Schlüssels des Zertifikats.
quelle
Obwohl ich an dem oben genannten teilgenommen habe, bin ich nach vielen Versuchen an diesen Punkt gekommen. 1- Wenn Sie vom Geschäft aus auf das Zertifikat zugreifen möchten, können Sie dies als Beispiel tun. 2- Es ist viel einfacher und sauberer, das Zertifikat zu erstellen und über einen Pfad zu verwenden
Asp.net Core 2.2 OR1:
ODER 2:
quelle
Klicken Sie im Zertifikatfenster mit der rechten Maustaste auf ein Zertifikat -> Alle Aufgaben -> Privaten Schlüssel verwalten -> IIS_IUSRS-Benutzer mit voller Kontrolle hinzufügen
In meinem Fall musste ich mein Zertifikat nicht installieren, wenn die Option "Exportieren des privaten Schlüssels zulassen" aktiviert war, wie in anderen Antworten angegeben.
quelle