0

Windows 2008 R2 サーバーのセットアップを自動化する Powershell スクリプトを作成していますが、必要なことの 1 つは、複数の証明書を異なるストアにインポートすることです。これを実現するための最善の方法について調査した結果、Importpfx.exe が、1 つの .pfx ファイルを Trusted People ストアにインポートし、別の .pfx ファイルを Personal ストアにインポートするという目的に最適であることがわかりました。 、両方ともコンピューター アカウント用です。次に、証明書がインポートされたら、個人ストアにインポートされた証明書の秘密キーを管理する必要もあります。

最初は、Importpfx.exe がこれを正しく行っていると思っていましたが、Powershell を介して秘密鍵を管理する方法を調査した結果、インポートされた証明書に対応するファイルの acl を編集することでこれを実行できることがわかりました。 「C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys」にあります。ここで、インポートされた証明書に何か問題があることに気付き始めました。証明書をインポートした後、このフォルダーで新しいファイルを検索した後、このフォルダーに新しいファイルが追加されていないことに気付きました。

Cドライブ全体を検索して、変更日順に並べ替えられたすべてのファイルを探したところ、このフォルダー「C:\Users\'user'\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-」に新しいファイルが追加されていることがわかりました予想されるフォルダーではなく、21-2545654756-3424728124-1046164030-4917」です。証明書ストアを介して証明書の秘密鍵を手動で管理することはできましたが (私はそれをインポートしたユーザーであったため)、他のユーザーはマシンにログオンして秘密鍵を管理することができず、「証明書が見つかりません」というエラー メッセージが表示されました。復号化のための証明書と秘密鍵」(対応するファイルが存在するフォルダーを考えると、これは理にかなっています)。

.pfx ファイルをインポートする前に、関数を使用して証明書の拇印を取得します。私が実行するために使用したコードは次のとおりです。

function GetCertificateThumbprint ( [string]$certPreFix, [string]$certPassword, [string]$certFolder, [string]$domain, [bool]$addIfNotFound, [hashtable]$return)

$storePath = "cert:\LocalMachine"
$storeDir = "My"
$storeName = [System.Security.Cryptography.X509Certificates.StoreName]::My
if($certPreFix -eq "XXX")
{
    $storeDir = "TrustedPeople"
    $storeName = [System.Security.Cryptography.X509Certificates.StoreName]::TrustedPeople
}
$storePath = [System.IO.Path]::Combine($storePath, $storeDir)
#Build the certificate file name and get the file
$certFileName = $certPreFix + "." + $domainName + ".*"
$certFile = Get-ChildItem -Path $certFolder -Include $certFileName -Recurse
if ($certFile)
{
#   The certificate file exists so get the thumbprint   
    $Certificate = New-Object system.Security.Cryptography.X509Certificates.X509Certificate2($certFile, $certPassword)
    $certThumbprint = $Certificate.Thumbprint
    if($addIfNotFound)
    {
#       Check for the certificate's thumbprint in store and add if it does not exist already    
        if(-not(Get-ChildItem $storePath | Where-Object {$_.Thumbprint -eq $certThumbprint}))
        {
            Set-Location "$Env:windir\Tools"
            .\importpfx.exe -f $certFile -p $certPassword -t MACHINE -s $storeDir
        }
    }
}

私が何か悪いことをしたかどうか、誰でも見ることができますか? 誰かがこの問題に遭遇し、何とか回避しましたか? 秘密鍵の管理タスクを適切に自動化できないため、これにより問題が発生しています。

4

1 に答える 1

1

私はちょうど同じ問題に遭遇しました。証明書オブジェクトを作成するときは、 MachineKeySet X509KeyStorageFlagを指定する必要があります。

New-Object system.Security.Cryptography.X509Certificates.X509Certificate2($certFile, $certPassword, "PersistKeySet,MachineKeySet")

うまくいけば、それは誰かを助けます。

于 2013-04-18T04:10:26.787 に答える