2010-04-09 4 views
84

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"; 
    } 
}

Antwort

138
  1. erstellen/Kauf-Zertifikat. Stellen Sie sicher, dass es einen privaten Schlüssel hat.
  2. Importieren Sie das Zertifikat in das Konto "Lokaler Computer". Am besten, Zertifikate MMC zu verwenden. Vergewissern Sie sich, dass die Option "Ermöglichen des Exports eines privaten Schlüssels" aktiviert ist.
  3. Basierend darauf verwendet die Identität des IIS 7.5 Application Pool einen der folgenden Punkte.

    • IIS 7.5 Website wird unter ApplicationPoolIdentity ausgeführt. Open MMC => Zertifikate hinzufügen (Lokaler Computer) Snap-In => Zertifikate (Lokaler Computer) => Persönlich => Zertifikate => Rechtsklick auf das Zertifikat von Interesse => Alle Aufgaben => Private Schlüssel verwalten => Hinzufügen IIS AppPool\AppPoolName und gewähren Full control. Ersetzen Sie "AppPoolName" durch den Namen Ihres Anwendungspools (manchmal IIS_IUSRS)
    • IIS 7.5 Website wird unter NETWORK SERVICE ausgeführt. Verwenden Sie Zertifikate MMC, hinzugefügt "NETWORK SERVICE" Full Trust auf Zertifikat in "Local Computer \ Personal".
    • IIS 7.5 Website wird unter dem lokalen Computerbenutzerkonto "MyIISUser" ausgeführt. Verwenden Sie Zertifikate MMC, fügte "MyIISUser" (ein neues lokales Computerbenutzerkonto) Full Trust für Zertifikat in "Local Computer \ Personal" hinzu.

aktualisieren, basierend auf @Phil Hale Kommentar:

Vorsicht, wenn Sie auf einer Domäne sind, wird Ihre Domain standardmäßig in dem 'von dem Standort box' ausgewählt werden. Stellen Sie sicher, dass Sie dies zu "Lokaler Computer" ändern. Ändern Sie den Speicherort auf "Lokaler Computer", um die App-Pool-Identitäten anzuzeigen.

+0

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

+3

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

+6

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

5

Für mich war es nichts mehr als das Zertifikat mit "Zulassen, dass der private Schlüssel exportiert werden soll" zu überprüfen.

Ich denke, es ist notwendig, aber es macht mich nervös, da es eine Drittanbieter-App ist, die auf dieses Zertifikat zugreift.

+1

Gleiches Problem hier – jcolebrand

35

Hinweis auf Berechtigungen über MMC gewähren, Zertifikate, Select Cert der rechten Maustaste, all-Aufgaben, „Private Schlüssel verwalten“

private Schlüssel verwalten nur in der Menüliste ist für Personal ... Also, wenn Sie Haben Sie Ihr Zertifikat in Trusted People usw. eingetragen, haben Sie kein Glück.

Wir haben einen Weg gefunden, der für uns arbeitete. Ziehen Sie das Zertifikat per Drag & Drop auf "Persönlich" und führen Sie die Funktion "Private Schlüssel verwalten" aus, um Berechtigungen zu erteilen. Denken Sie daran, die Verwendung von Objekttyp-Built-Ins festzulegen und die Domäne des lokalen Computers zu verwenden. Wir haben dem DefaultAppPool-Benutzer Rechte gewährt und ihn dabei belassen.

Sobald Sie fertig sind, ziehen Sie das Zertifikat zurück, wo immer Sie es ursprünglich hatten. Presto.

+0

ja das funktioniert gut. Ich erwähnte es in einer Antwort auf den folgenden Beitrag, aber eine andere Antwort wurde akzeptiert, obwohl die angenommene Antwort viel länger ist und erfordert das Herunterladen einer WCF-Datei. http://stackoverflow.com/questions/10580326/privatekey-trust-permissions-for-local-machine-trusted-roots-certificates/10594123#10594123 – thames

+2

jede Lösung für win2003 Server? es hat nicht die Verwaltung privater Schlüssel als eine Option wie Windows 7 – sonjz

+0

Danke dafür. Es funktionierte für mich auf Windows Server 2008 R2. –

4

ich herausgefunden, wie dies in Powershell zu tun, dass jemand gefragt:

$keyname=(((gci cert:\LocalMachine\my | ? {$_.thumbprint -like $thumbprint}).PrivateKey).CspKeyContainerInfo).UniqueKeyContainerName 
$keypath = $env:ProgramData + “\Microsoft\Crypto\RSA\MachineKeys\” 
$fullpath=$keypath+$keyname 

$Acl = Get-Acl $fullpath 
$Ar = New-Object System.Security.AccessControl.FileSystemAccessRule("IIS AppPool\$iisAppPoolName", "Read", "Allow") 
$Acl.SetAccessRule($Ar) 
Set-Acl $fullpath $Acl 
4

Wenn Sie die Lösung eine cert aus einer PFX-Datei in IIS zu laden versuchen, so einfach sein, diese Option als Freigabe für die Application Pool.

Klicken Sie mit der rechten Maustaste auf den App Pool und wählen Sie Advanced Settings.

Dann Load User Profile


enter image description here

Verwandte Themen