Domanda

Ho un'applicazione ASP.NET che accede chiave privata in un certificato nell'archivio certificati. In Windows Server 2003 sono stato in grado di utilizzare WinHttpCertCfg.exe per dare accesso chiave privata per l'account NETWORK SERVICE. Come faccio a dare autorizzazioni per l'accesso di una chiave privata in un certificato nell'archivio certificati (Local Computer \ Personal) su un 2008 R2 di Windows Server in un sito web IIS 7.5?

Ho provato che dà accesso Full Trust a "tutti", "IIS AppPool \ DefaultAppPool", "IIS_IUSRS", e everyother sicurezza dell'account sono riuscito a trovare utilizzando il MMC Certificati (Server 2008 R2). Tuttavia il sottostante Codice dimostra che il codice non ha accesso alla chiave privata di un certificato che è stato importato con la chiave privata. Il codice genera invece e ogni errore la proprietà chiave privata si accede.

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

È stato utile?

Soluzione

  1. Crea / certificato di acquisto. Assicurarsi che ha una chiave privata.
  2. Importa il certificato sul conto "computer locale". Meglio usare MMC Certificati. Assicurati di controllare "Consenti chiave privata da esportare"
  3. In base su cui, IIS 7.5 del Pool di Applicazioni utilizzo dell'identità uno dei seguenti.

    • IIS 7.5 sito è in esecuzione in ApplicationPoolIdentity. Aprire MMC => aggiungere certificati (computer locale) snap-in => Certificati (Computer locale) => Personal => Certificati => Tasto destro del mouse il certificato di interesse => Tutte le attività => Gestisci chiave privata => Aggiungi IIS AppPool\AppPoolName e concederle Full control. Sostituire " NomePoolApp " con il nome del pool di applicazioni (a volte IIS_IUSRS)
    • IIS 7.5 sito web è in esecuzione con NETWORK SERVICE. Utilizzo dei certificati MMC, aggiunto "SERVIZIO DI RETE" per completa fiducia sulla certificazione in "Local Computer \ Personal".
    • IIS 7.5 sito web è in esecuzione con account utente del computer locale "MyIISUser". Utilizzo dei certificati MMC, aggiunto "MyIISUser" (un nuovo account utente del computer locale) a completa fiducia sulla certificazione in "Local Computer \ Personal".

Aggiornamento sulla base @Phil Hale commento:

Attenzione, se siete su un dominio, il dominio sarà selezionata per impostazione predefinita nella 'scatola da posizione'. Assicurati di cambiare la situazione a "computer locale". Modificare la posizione a "Computer locale" per visualizzare le identità del pool di app.

Altri suggerimenti

Nota sulla concessione di permessi tramite MMC, Certificati, Select Cert, tasto destro del mouse, tutti-i compiti, "Gestione chiavi private"

Gestisci chiavi private è solo sulla lista del menu per Personal ... Quindi, se hai messo il tuo cert a persone di fiducia, ecc sei fuori di fortuna.

Abbiamo trovato un modo per aggirare questo, che ha lavorato per noi. Trascinare e rilasciare il CERT al personale, fanno il gestire le chiavi privato cosa da concedere le autorizzazioni. Ricordate di impostare per utilizzare l'oggetto di tipo built-in e utilizzare la macchina locale, non di dominio. Abbiamo concesso i diritti per l'utente DefaultAppPool e lasciato le cose come stanno.

Una volta fatto, trascinare e rilasciare la parte posteriore cert dove mai è stato originariamente avuto. Presto.

Se si sta tentando di caricare un cert da un file .pfx in IIS la soluzione può essere semplice come l'attivazione di questa opzione per il Application Pool.

Fare clic destro su App Pool e selezionare Advanced Settings.

Poi abilitare Load User Profile

 entrare descrizione dell'immagine qui

ho capito come fare questo in PowerShell che qualcuno ha chiesto:

$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

Per quanto mi riguarda, non era niente più che ri-importare il certificato con "Rendi la chiave privata esportabile" selezionata.

Credo che sia necessario, ma rende nervoso in quanto è un app di terze parti l'accesso a questo certificato.

A complemento delle risposte questo è un guida per trovare la chiave privata del certificato e aggiungere le autorizzazioni.

Questa è la guida per ottenere FindPrivateKey.exe trovato nella guida per trovare la chiave privata del certificato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top