Найдите и удалите дублирующие корневые сертификаты.

Вопрос или проблема

Мы находимся в отключенной доменной среде и только что внедрили обновленные корневые сертификаты через групповую политику. Однако я обнаружил, что в хранилище пользователей есть ряд дублированных корневых сертификатов (и еще больше для моего, так как я время от времени подключал свой ноутбук к интернету).

Мне нужен скрипт PowerShell, который пройдет по хранилищу корневых сертификатов и удалит любые дубликаты там.

Вот что у меня есть на данный момент:

$store = New-Object System.Security.Cryptography.X509Certificates.X509Store("Root","LocalMachine")
$store.Open("ReadWrite")
$rootcerts = Get-Childitem 'cert:\LocalMachine\root' -Recurse
$ht = @{}
$rootcerts  | foreach {$ht["$_"] += 1}
$duplicates = $ht.keys | where {$ht["$_"] -gt 1}

Но как удалить дубликаты, я не знаю.

Вместо того чтобы обновлять счетчик на основе объекта сертификата, вам нужно сохранить больше информации о сертификате во время вашей итерации. Я решил создать дополнительное отображение отпечатков как ключей и объекты сертификатов как значения. Таким образом, поиск сначала осуществляется по субъекту, а затем по отпечатку.

Затем я удаляю самые старые сертификаты и оставляю самые новые.

$ht = @{}
Get-ChildItem -Recurse Cert:\LocalMachine\My |
    Where-Object { $_.Issuer -like "*MyIssuer*"  } |
    ForEach-Object {
        $subject = $_.Subject
        if (!$ht.ContainsKey($subject)) {
            $ht[$subject] = @{}
        }
        $ht[$subject]["$($_.Thumbprint)"] = $_
    }

$ht.Keys | ForEach-Object {
    $dupes = ($ht[$_] | Where-Object { $_.Count -gt 1 })
    if ($dupes) {
        $dupes.GetEnumerator() |
            Sort-Object [DateTime]"${Value.GetDateTimeString()}" -Descending |
            Select-Object -ExpandProperty Value -Skip 1 |
            ForEach-Object {
                if (Test-Path $_.PSPath) {
                    Remove-Item -Path $_.PSPath -DeleteKey
                }
            }
    }
}

Ответ или решение

Удаление дублированных корневых сертификатов является важной задачей для поддержания безопасности системы, особенно в случае отключенной доменной сети. Ниже представлен подробный подход с использованием PowerShell для поиска и удаления дубликатов корневых сертификатов в локальном хранилище сертификатов.

Шаг 1: Подготовка среды

Перед началом процесса убедитесь, что у вас есть права администратора для работы с хранилищем сертификатов. Для этого можно запустить PowerShell с правами администратора.

Шаг 2: Поиск дублированных сертификатов

Мы будем использовать PowerShell для поиска дублированных сертификатов, основываясь на их субъектах и отпечатках. Важно сохранять информацию о сертификатах, чтобы можно было удалить старые дубликаты.

# Открываем хранилище корневых сертификатов
$store = New-Object System.Security.Cryptography.X509Certificates.X509Store("Root", "LocalMachine")
$store.Open("ReadWrite")

# Создаем хэш-таблицу для хранения сертификатов
$ht = @{}

# Получаем все сертификаты из корневого хранилища
Get-ChildItem -Recurse Cert:\LocalMachine\Root | ForEach-Object {
    # Получаем субъект сертификата
    $subject = $_.Subject
    # Если предмет не встречается, создаем запись о нем
    if (!$ht.ContainsKey($subject)) {
        $ht[$subject] = @{}
    }
    # Сохраняем сертификаты по отпечаткам
    $ht[$subject]["$($_.Thumbprint)"] = $_
}

# Обрабатываем сертификаты для поиска дубликатов
$ht.Keys | ForEach-Object {
    $dupes = $ht[$_] | Where-Object { $_.Count -gt 1 }
    if ($dupes) {
        # Сортируем дубликаты по дате, оставляя самый новый
        $dupes.GetEnumerator() |
            Sort-Object {[DateTime]$_.Value.GetDateTimeString()} -Descending |
            Select-Object -ExpandProperty Value -Skip 1 |
            ForEach-Object {
                # Удаляем дубликаты
                if (Test-Path $_.PSPath) {
                    Remove-Item -Path $_.PSPath -DeleteKey
                }
            }
    }
}

# Закрываем хранилище
$store.Close()

Шаг 3: Объяснение сценария

  1. Открытие хранилища: Мы открываем локальное хранилище сертификатов "Root" с правами на чтение и запись.
  2. Сохранение сертификатов: Все сертификаты, находящиеся в хранилище, сохраняются в хеш-таблице, где ключами являются субъекты сертификатов, а значениями — их отпечатки и соответствующие объекты сертификатов.
  3. Поиск и удаление дубликатов: После создания хэш-таблицы, мы ищем дубликаты. Для каждой группы дубликатов мы сортируем их по дате. Оставляем самый новый сертификат и удаляем все остальные.
  4. Закрытие хранилища: После завершения всех операций мы закрываем хранилище.

Заключение

Данный подход позволяет эффективно находить и удалять дубликаты корневых сертификатов в вашей системе. Регулярная проверка на наличие дубликатов не только помогает поддерживать порядок в хранилище сертификатов, но и улучшает безопасность, снижая вероятность возникновения конфликтов и атак.

Не забывайте тестировать сценарий на тестовом окружении перед его развертыванием в продуктивной среде, чтобы убедиться в корректности работы и избежать нежелательных последствий.

Оцените материал
Добавить комментарий

Капча загружается...