IISを備えたWindows 2012 R2サーバーでは、C:\ ProgramData\Microsoft\Crypto\RSA\MachineKeysに証明書を生成し、キーを永続化するWebアプリケーションがあります。問題を修正しましたが、フォルダーには6,000,000を超えるファイルが含まれています。
フォルダーの名前を変更して空のMachineKeysフォルダーを作成しようとしましたが、SSL接続を処理するOSの機能を壊しました。
このスクリプトを使用して、どのLocalMachineリポジトリ証明書がどのファイル名に対応するかを見つけることができます。
Foreach ($MachineCert In Get-ChildItem Cert:\LocalMachine -Recurse | Where HasPrivateKey)
{
$array += $MachineCert |
Select @{n='Subject'; e={ $MachineCert.Subject }},
@{n='Container'; e={ $MachineCert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName }},
@{n='Store'; e={ $MachineCert.PSParentPath }}
}
ただし、この情報をどうするかわかりません。何百万ものファイルがあるので、上記のスクリプトで報告されたファイル以外のすべてを安全に使用できるようにする必要がありますか?
私はこれを理解することができました。まず、このスクリプトを使用して、保持する必要がある証明書のリストをコンパイルしました。
$array = @()
Foreach ($MachineCert In Get-ChildItem Cert:\LocalMachine -Recurse | Where HasPrivateKey)
{
$array += $MachineCert |
Select @{n='Subject'; e={ $MachineCert.Subject }},
@{n='Container'; e={ $MachineCert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName }},
@{n='Store'; e={ $MachineCert.PSParentPath }}
}
$array | Export-CSV c:\temp\out.csv
次に、出力ファイルからすべてのコンテナー名を取得し、それらを別のスクリプトに送り、ファイルを一致するファイル名のMachineKeysフォルダーから別のフォルダーにコピーしました。
$arr = @(
"f686aace6942fb7f7ceb231212eef4a4_4cd8c04c-5245-4f49-962b-9e4388716e1f",
"d1acbca52745e8cdc7796dc9283bb8fc_4cd8c04c-5245-4f49-962b-9e4388716e1f",
"83ceb9ab426f3fa7efdf06154db8cd13_4cd8c04c-5245-4f49-962b-9e4388716e1f",
"98d0bf53be581119e8ac290607289a64_4cd8c04c-5245-4f49-962b-9e4388716e1f",
"e955cd99d4ab953714119f933c483fd5_4cd8c04c-5245-4f49-962b-9e4388716e1f",
"1b1f4753df9704baf9d16743d0c9b3d1_4cd8c04c-5245-4f49-962b-9e4388716e1f",
"a31b3a063eb59a2fe7801565c6aa3846_4cd8c04c-5245-4f49-962b-9e4388716e1f"
)
gci -File -Recurse -Include $arr | % { copy-item $_.FullName "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys_new" }
このスクリプトは、何百万ものファイルを処理する必要があったため、ほぼ1日実行されました。完了したら、既存のフォルダーの名前を「MachineKeys_old」に変更し、新しいフォルダーの名前を上記のスクリプトから「MachineKeys」に変更しました。サーバーを再起動して、すべてが正常に機能することを確認しました。 SQL、IIS、すべてが機能します。
注意すべきもう1つのこと-新しいMachineKeysフォルダーに適切なアクセス許可を割り当ててください。私にとっては、「全員」に読み取り/書き込み/変更」アクセス権を与える必要がありました。