Come concedere l’accesso ASP.NET a una chiave privata in un certificato nell’archivio certificati?

Ho un’applicazione ASP.NET che accede alla chiave privata in un certificato nell’archivio certificati. In Windows Server 2003 sono riuscito a utilizzare winhttpcertcfg.exe per consentire l’accesso alla chiave privata all’account SERVIZIO DI RETE. Come concedo le autorizzazioni per accedere a una chiave privata in un certificato nell’archivio certificati (Computer locale \ Personale) su un server Windows Server 2008 R2 in un sito Web IIS 7.5?

Ho provato a concedere l’accesso completo a “Tutti”, “IIS AppPool \ DefaultAppPool”, “IIS_IUSRS” e ogni altro account di sicurezza che potrei trovare utilizzando il certificato MMC (Server 2008 R2). Tuttavia, il codice seguente dimostra che il codice non ha accesso alla chiave privata di un certificato importato con la chiave privata. Il codice invece genera ed errore ogni volta che si accede alla proprietà della chiave privata.

Default.aspx

         
Cert Public Key Private Key

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

  1. Crea / Acquista certificato. Assicurati che abbia una chiave privata.
  2. Importa il certificato nell’account “Computer locale”. Meglio usare i certificati MMC. Assicurati di selezionare “Consenti la chiave privata da esportare”
  3. In base a ciò, l’identity framework del pool di applicazioni IIS 7.5 utilizza uno dei seguenti.

    • Il sito Web IIS 7.5 è in esecuzione in ApplicationPoolIdentity. Apri MMC => Aggiungi certificati (computer locale) snap-in => Certificati (computer locale) => Personale => Certificati => Fai clic con il pulsante destro del mouse sul certificato di interesse => Tutte le attività => Gestisci chiave privata => Aggiungi IIS AppPool\AppPoolName e garantiscilo Full control Sostituisci ” AppPoolName ” con il nome del pool di applicazioni (a volte IIS_IUSRS )
    • IIS 7.5 Sito Web in esecuzione in SERVIZIO DI RETE. Utilizzando Certificati MMC, aggiunto “SERVIZIO DI RETE” a Full Trust sul certificato in “Computer locale \ Personale”.
    • Il sito Web IIS 7.5 è in esecuzione con l’account utente del computer locale “MyIISUser”. Utilizzando i certificati MMC, aggiunto “MyIISUser” (un nuovo account utente del computer locale) a Full Trust sul certificato in “Computer locale \ Personale”.

Aggiornamento basato sul commento di @Phil Hale:

Attenzione, se sei su un dominio, il tuo dominio verrà selezionato per impostazione predefinita nella casella “dalla posizione”. Assicurati di cambiarlo in “Computer locale”. Modificare la posizione in “Computer locale” per visualizzare le identity framework del pool di applicazioni.

Nota sulla concessione delle autorizzazioni tramite MMC, Certs, Select Cert, tasto destro del mouse, tutte le attività, “Gestisci chiavi private”

Gestisci Private Keys è solo nell’elenco dei menu per Personal … Quindi se hai inserito il tuo cert in Trusted People, ecc. Sei sfortunato.

Abbiamo trovato un modo per aggirare questo che ha funzionato per noi. Trascina e rilascia il certificato in Personal, esegui la gestione Gestisci chiavi private per concedere le autorizzazioni. Ricordarsi di impostare l’utilizzo di built-in di tipo object e utilizzare il computer locale non dominio. Abbiamo concesso i diritti all’utente DefaultAppPool e lo abbiamo lasciato.

Una volta terminato, trascina e rilascia il certificato indietro nel punto in cui l’hai avuto in origine. Presto.

Ho capito come farlo 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 

Se si sta tentando di caricare un certificato da un file .pfx in IIS, la soluzione potrebbe essere semplice come abilitare questa opzione per il Application Pool .

Fare clic con il tasto destro del mouse sul Pool di app e selezionare Advanced Settings .

Quindi abilitare Load User Profile

inserisci la descrizione dell'immagine qui

Per me, non è stato altro che re-importare il certificato con “Consenti la chiave privata da esportare” selezionata.

Immagino sia necessario, ma mi rende nervoso perché è un’app di terze parti che accede a questo certificato.