2013-03-19 11 views
5

Przeszukałem wszystko i nie mogłem znaleźć wielu informacji, zasadniczo mam system Windows 2008 R2, stworzyłem skrypt PowerShell, aby załadować plik PFX do magazynu certyfikatów Lokalna maszyna już.Przydzielenie puli aplikacji Grant IIS 7.5 Uprawnienia do certyfikatu Klucz prywatny przy użyciu PowerShell

Teraz muszę zezwolić mojej puli aplikacji na odczytanie klucza prywatnego certyfikatu za pomocą PowerShell.

W starym systemie Windows 2003, po prostu potrzebuję uzyskać rzeczywisty plik siedzący w folderze C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\, ale wygląda na to, że Win 2008 używa innego folderu.

Ktoś ma jakieś rozwiązanie?

- Aktualizacja moją wersję kodu -

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 
} 

W moim Get-CertificateStorePath funkcji otrzymuję wartość jako C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\, po tym, jak uzyskać certyfikat hash, kompletny plik wygląda C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\d82829f7770ea5d85ef978dea67f302d_4cca7190-7e9f-46d7-b180-6656fec432e2, kiedy wykonać Get-Acl linię mam wyjątek Cannot find path 'C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\d82829f7770ea5d85ef978dea67f302d_4cca7190-7e9f-46d7-b180-6656fec432e2' because it does not exist..

Przeglądałem ten folder, naprawdę nie mogłem znaleźć takiego pliku.

- Update -

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 
} 

Odpowiedz

2

2008 R2 używa C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys

Via PowerShell można zobaczyć CERT dostępny do IIS tutaj:

cert:\LocalMachine\My 

Można cd w tym miejscu i poszukaj swojego certyfikatu. Kiedy go znaleźć można wyświetlić jego identyfikator klucza prywatnego przy użyciu:

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

ten będzie zawierał długą szesnastkowy pliku z folderu MachineKeys.

Następnie można zmienić uprawnienia pliku, używając cmdletu Set-Acl.

Można również wyświetlić uprawnienia poprzez MMC Certyfikaty mmc/add snapin/certificates/computer account/local computer a następnie certificates/personal/certificates/[your cert]/all tasks/manage private keys

+0

Proszę zobaczyć mój zaktualizowany wpis, aby zobaczyć więcej szczegółów. – hardywang

+0

Prześlij swój ładunek kod pliku PFX –

+0

Zobacz mój zaktualizowany post i sprawdź funkcję 'Get-LocalMachineCertificate' – hardywang

0

Jeśli przeciągnij i upuść certyfikat z magazynu użytkownika \ osobiste do Computer Store \ osobowych, wartość $ getCert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName jest źle. Nie ma pliku o tej wartości. Zaimportuj certyfikat ponownie w odpowiednim sklepie i będzie działać.

0

Poniżej znajduje się pełny skrypt powershell, który daje uprawnienia każdemu użytkownikowi na kluczu prywatnym certyfikatu.

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

powyższy link ma scenariusza i przykład jak uruchomić go na oknie konsoli PowerShell.

Jeśli używasz ApplicationPoolIdentity wtedy nazwa użytkownika będzie 'IIS AppPool \ AppPoolNameHere'

Uwaga: Trzeba będzie użyć '' ponieważ istnieje przestrzeń między IIS i AppPool.

Powiązane problemy