Вопрос или проблема
Я хотел бы разместить сертификат P12 (для OpenVPN) в Хранилище сертификатов Windows, а именно в LocalMachine\Personal. Причина в том, что сертификат будет защищен как минимум паролем локального администратора.
Конечно, я могу сделать это вручную. Легко дважды щелкнуть на файле P12, ввести учетные данные локального администратора и пройти мастера до конца. Затем я могу увидеть сертификат в LocalMachine\Personal и подключить свой клиент OpenVPN (как обычный пользователь, который не является администратором).
Но, конечно, я не хочу делать это вручную для множества компьютеров. Поэтому я использовал GPO для доставки
- файла P12 в C:\Temp\Windows на все мои компьютеры
- BAT-скрипта, который импортирует сертификат и удаляет файл P12
- запланированной задачи, которая запускает этот скрипт
содержимое BAT файла
certutil -p “” -importpfx “C:\Windows\Temp\certificate.p12”
del “C:\Windows\Temp\certificate.p12”
Я использовал “запуск от имени: System” в запланированных задачах и да. Сертификат импортируется в LocalMachine\Personal, я вижу это. Но подключение OpenVPN невозможно. Я получаю сообщение об ошибке, что сертификат не найден. Это ведет себя так, как будто сертификат не был импортирован.
Знаете ли вы, как запустить запланированную задачу от имени локального администратора?
Или знаете ли вы, как это решить, если это проблема с разрешениями?
Спасибо
# Путь к файлу PFX на сетевом ресурсе
$certPath = "\\yourserver\share\certificate.p12"
$certPassword = ConvertTo-SecureString -String "yourPFXPasswordHere" -AsPlainText -Force
$certStoreLocation = "Cert:\LocalMachine\My"
# Проверка, существует ли сертификат, чтобы избежать дубликатов
$existingCert = Get-ChildItem -Path $certStoreLocation | Where-Object { $_.Subject -eq "CN=YourCertificateSubjectHere" }
if ($existingCert -eq $null) {
try {
# Импорт сертификата
$cert = Import-PfxCertificate -FilePath $certPath -CertStoreLocation $certStoreLocation -Password $certPassword -Exportable
# Опционально, установить ACL, чтобы обеспечить доступ к сертификату пользователям
$certPathInStore = Join-Path -Path $certStoreLocation -ChildPath $cert.Thumbprint
$rule = New-Object System.Security.AccessControl.RegistryAccessRule ("Everyone", "FullControl", "Allow")
$acl = Get-Acl -Path $certPathInStore
$acl.SetAccessRule($rule)
Set-Acl -Path $certPathInStore -AclObject $acl
Write-Output "Сертификат успешно импортирован."
}
catch {
Write-Output "Не удалось импортировать сертификат: $_"
}
} else {
Write-Output "Сертификат уже существует в хранилище."
}
Ответ или решение
Чтобы импортировать сертификат PFX в хранилище LocalMachine/Personal на компьютеры в домене Windows, не привлекая локальных администраторов для каждого компьютера вручную, можно воспользоваться групповой политикой (GPO). Приведенный ниже метод поможет вам сделать это эффективно.
Шаги по развертыванию сертификата PFX через GPO
1. Подготовка файлов
Сначала убедитесь, что у вас есть доступ к PFX файлу (например, certificate.p12
), который вы хотите развернуть. Этот файл должен быть защищен паролем, который вы знаете.
2. Создание общего сетевого ресурса
Разместите сертификат на общем сетевом ресурсе, к которому могут получить доступ все компьютеры, например, \\yourserver\share\certificate.p12
.
3. Создание PowerShell скрипта
Создайте PowerShell скрипт для автоматизации процесса импорта сертификата. Скрипт, представленный ниже, содержит ключевые шаги для этого:
# Путь к PFX файлу на общем сетевом ресурсе
$certPath = "\\yourserver\share\certificate.p12"
$certPassword = ConvertTo-SecureString -String "yourPFXPasswordHere" -AsPlainText -Force
$certStoreLocation = "Cert:\LocalMachine\My"
# Проверка существования сертификата, чтобы избежать дублирования
$existingCert = Get-ChildItem -Path $certStoreLocation | Where-Object { $_.Subject -eq "CN=YourCertificateSubjectHere" }
if ($existingCert -eq $null) {
try {
# Импорт сертификата
$cert = Import-PfxCertificate -FilePath $certPath -CertStoreLocation $certStoreLocation -Password $certPassword -Exportable
# Установка ACL для обеспечения доступа пользователей
$certPathInStore = Join-Path -Path $certStoreLocation -ChildPath $cert.Thumbprint
$rule = New-Object System.Security.AccessControl.RegistryAccessRule ("Everyone", "FullControl", "Allow")
$acl = Get-Acl -Path $certPathInStore
$acl.SetAccessRule($rule)
Set-Acl -Path $certPathInStore -AclObject $acl
Write-Output "Сертификат успешно импортирован."
}
catch {
Write-Output "Не удалось импортировать сертификат: $_"
}
} else {
Write-Output "Сертификат уже существует в хранилище."
}
4. Настройка групповой политики
-
Создание нового объекта GPO:
- Откройте
Group Policy Management Console
(GPMC). - Создайте новый объект GPO или выберите уже существующий.
- Откройте
-
Назначение скрипта:
- В разделе
Политики Компьютера
перейдите кКонфигурация Windows
>Сценарии (при запуске)
. - Добавьте созданный PowerShell скрипт.
- В разделе
-
Настройка параметров безопасности:
- Убедитесь, что у всех целевых устройств есть права на выполнение скрипта и доступ к сетевому ресурсу, где находится PFX файл.
5. Проверка и отладка
После настройки примените новую групповую политику к нужной организационной единице (OU) и перезагрузите компьютеры для применения политики. Убедитесь, что сертификат импортируется как ожидается, проверяя его наличие в LocalMachine/Personal с помощью certlm.msc
.
Заключение
Использование GPO для развертывания сертификатов PFX помогает значительно сократить затраты времени и ресурсов при управлении большим количеством устройств в корпоративной среде. Это обслуживает как вопросы безопасности, так и требования удобства использования для пользователей, не обладающих административными правами.