Windows 2012 R2 Server - Как безопасно удалить файлы из C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys

На сервере Windows 2012 R2 с IIS у нас есть веб-приложение, которое генерирует сертификаты в 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. Для меня я должен был дать доступ "Все" для чтения / записи / изменения.

Другие вопросы по тегам