在装有 IIS 的 Windows 2012 R2 服务器上,我们有一个 Web 应用程序,该应用程序在 C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys 中生成证书并保存密钥。我们已修复此问题,但现在文件夹中有超过 6,000,000 个文件。
我尝试重命名该文件夹并创建一个空的 MachineKeys 文件夹,但这破坏了操作系统处理 SSL 连接的能力。
我可以使用此脚本找到哪些 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 }}
}
但是,我不知道如何处理这些信息。有数以百万计的文件,除了上面的脚本报告的文件之外,我是否应该安全地启用所有文件?
答案1
我能够解决这个问题。首先,我使用这个脚本编译了一份需要保留的证书列表:
$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" }
该脚本运行了几乎一整天,因为它必须处理数百万个文件。完成后,我将现有文件夹重命名为“MachineKeys_old”,并将上述脚本中的新文件夹重命名为“MachineKeys”。我重新启动了服务器以确保一切正常,结果确实如此。SQL、IIS,一切都正常。
还有一件事需要注意——确保为新的 MachineKeys 文件夹分配了适当的权限。对我来说,我必须授予“每个人”读/写/修改权限。