2013-03-19 17 views
5

Ho cercato tutto intorno e non ho trovato molte informazioni, in pratica ho Windows 2008 R2, ho creato lo script PowerShell per caricare un file PFX nell'archivio certificati di Macchina locale già.Concessione autorizzazione pool di IIS 7.5 all'autorizzazione alla chiave privata del certificato utilizzando PowerShell

Ora devo concedere l'autorizzazione del mio pool di applicazioni per leggere la chiave privata del certificato utilizzando PowerShell.

Nel vecchio modo di Windows 2003, ho solo bisogno di ottenere il file effettivo seduto nella cartella C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\, ma sembra che Win 2008 usi una cartella diversa.

Qualcuno ha qualche soluzione?

- aggiornare la mia versione di codice -

function Grant-CertificatePermissions([string]$certSubject,[string]$user,[string]$permissionType,[string]$permission = $args[3]) 
{ 
    $getCert = Get-LocalMachineCertificate $certSubject 
    $keypath = Get-CertificateStorePath 
    $certHash = $getCert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName 
    $certFullPath = $keypath+$certHash 
    $certAcl = Get-Acl -Path $certFullPath 

    try 
    { 
     $accessRule=new-object System.Security.AccessControl.FileSystemAccessRule $user, $permissionType, $permission 
     $certAcl.AddAccessRule($accessRule) 
    } 
    catch [System.Exception] 
    { 
     throw "Invalid User Id Or Permission" 
    } 
    Set-Acl $certFullPath $certAcl 
} 

function Get-LocalMachineCertificate([string]$subject, [string]$certificateStoreLocation, [string]$certificateStoreName) 
{ 
    $getCert = Get-ChildItem -Recurse Cert:\$certificateStoreLocation\$certificateStoreName | Where-Object {$_.Subject -eq $subject} 

    if(!$getCert) 
    { 
     throw "Certificate Not Found" 
    } 

    return $getCert 
} 

function Get-CertificateStorePath 
{ 
    $commonCertPathStub = "\Microsoft\Crypto\RSA\MachineKeys\" 
    $programData = $Env:ProgramData 
    if(!$programData) 
    { 
     $programData = $Env:ALLUSERSPROFILE + "\Application Data" 
    } 

    $keypath = $programData + $commonCertPathStub 

    return $keypath 
} 

Nella mia funzione Get-CertificateStorePath ottengo valore come C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\, dopo che ottengo il certificato hash, il file completo si presenta come C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\d82829f7770ea5d85ef978dea67f302d_4cca7190-7e9f-46d7-b180-6656fec432e2, quando eseguo Get-Acl linea che ho eccezione Cannot find path 'C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\d82829f7770ea5d85ef978dea67f302d_4cca7190-7e9f-46d7-b180-6656fec432e2' because it does not exist..

Ho sfogliato quella cartella, non sono riuscito a trovare un file del genere.

- Aggiornamento -

function Import-PfxCertificate ([String]$certPath,[String]$certificateStoreLocation ,[String]$certificateStoreName, $pfxPassword) 
{ 
    $pfx = new-object System.Security.Cryptography.X509Certificates.X509Certificate2  

    $pfx.Import($certPath, $pfxPassword, "Exportable,PersistKeySet")  

    $store = new-object System.Security.Cryptography.X509Certificates.X509Store($certificateStoreName,$certificateStoreLocation)  
    $store.open("MaxAllowed")  
    $store.add($pfx)  
    $store.close() 
    return $pfx 
} 

risposta

2

2008 R2 utilizza C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys

Via PowerShell è possibile vedere i certs disponibili a IIS qui:

cert:\LocalMachine\My 

Puoi cd in quella posizione e cerca il tuo cert. Una volta trovato che è possibile visualizzare il proprio ID chiave privata utilizzando:

$cert = get-item 2779B37AE3625FD8D2F9596E285C7CDC15049D87 
$cert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName 

Questa conterrà il nome lungo esadecimale dalla cartella MachineKeys.

È quindi possibile modificare le autorizzazioni del file utilizzando il cmdlet Set-Acl.

È inoltre possibile visualizzare le autorizzazioni tramite il MMC Certificati mmc/add snapin/certificates/computer account/local computer e poi certificates/personal/certificates/[your cert]/all tasks/manage private keys

+0

Si prega di consultare il mio post aggiornato per vedere maggiori dettagli. – hardywang

+0

Inserisci il tuo carico un file PFX codice –

+0

Si prega di consultare il mio post aggiornato, e controllare la funzione 'Get-LocalMachineCertificate' – hardywang

0

Se si trascina e rilascia un certificato da archivio utente \ Personal Computer a Store \ Personal, il valore di $ getCert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName è sbagliato. Non esiste un file con quel valore. Importa nuovamente il certificato nel negozio giusto e funzionerà.

0

qui è uno script PowerShell completo per concedere l'autorizzazione a qualsiasi utente sulla chiave privata del certificato.

How to Grant permission to user on Certificate private key using powershell?

link qui sopra ha scritto e l'esempio di come eseguirlo sulla finestra della console PowerShell.

Se si utilizza ApplicationPoolIdentity allora si nome utente verrà 'IIS AppPool \ AppPoolNameHere'

Nota: Sarà necessario utilizzare '' in quanto v'è uno spazio tra IIS e AppPool.