5

私はあちこち検索しましたが、多くの情報を見つけることができませんでした.基本的に私はWindows 2008 R2を持っています.ローカルマシンの証明書ストアにPFXファイルをロードするPowerShellスクリプトを作成しました.

ここで、PowerShell を使用して証明書の秘密キーを読み取るためのアプリ プールのアクセス許可を付与する必要があります。

古い方法の Windows 2003 では、実際のファイルをC:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\フォルダーに格納するだけで済みますが、Win 2008 では別のフォルダーを使用しているようです。

誰かが解決策を持っていますか?

-- コードのバージョンを更新 --

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
}

私のGet-CertificateStorePath関数ではC:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\、証明書ハッシュを取得した後、完全なファイルは のように値を取得します。行C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\d82829f7770ea5d85ef978dea67f302d_4cca7190-7e9f-46d7-b180-6656fec432e2を実行するGet-Aclと、例外がありますCannot find path 'C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\d82829f7770ea5d85ef978dea67f302d_4cca7190-7e9f-46d7-b180-6656fec432e2' because it does not exist.

そのフォルダをブラウズしましたが、確かにそのようなファイルは見つかりませんでした。

- アップデート -

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
} 
4

3 に答える 3

2

2008 R2 使用C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys

PowerShell を使用すると、IIS で使用できる証明書を次の場所で確認できます。

cert:\LocalMachine\My

その場所に cd して証明書を探すことができます。見つかったら、次を使用して秘密鍵 ID を表示できます。

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

これには、MachineKeys フォルダーからの長い 16 進数のファイル名が含まれます。

Set-Aclその後、コマンドレットを使用してファイルのアクセス許可を変更できます。

また、証明書 MMC を介してアクセス許可を表示し、mmc/add snapin/certificates/computer account/local computer次にcertificates/personal/certificates/[your cert]/all tasks/manage private keys

于 2013-03-19T02:17:36.873 に答える
0

User Store\Personal から Computer Store\Personal に証明書をドラッグ アンド ドロップすると、$getCert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName の値が正しくありません。その値を持つファイルはありません。証明書を正しいストアに再度インポートすると、機能します。

于 2014-11-14T14:33:07.300 に答える
0

これは、証明書の秘密鍵で任意のユーザーに許可を与えるための完全な PowerShell スクリプトです。

powershellを使用して証明書の秘密鍵に対するアクセス許可をユーザーに付与する方法は?

上記のリンクには、スクリプトと、powershell コンソール ウィンドウで実行する方法の例があります。

ApplicationPoolIdentity を使用している場合、ユーザー名は「IIS AppPool\AppPoolNameHere」になります。

: IIS と AppPool の間にスペースがあるため、 「 」を使用する必要があります。

于 2016-10-14T15:48:57.057 に答える