SSL: автоматическое обновление
Windows Server и IIS
Задание Планировщика Windows раз в сутки забирает свежий сертификат, привязывает его к ключу в хранилище Windows и к сайту IIS.
Обновляется сам
Подходит для сайта на IIS (Windows Server 2016 и новее), если сертификат уже стоит на сервере — то есть закрытый ключ лежит в хранилище сертификатов Windows. Так бывает, когда CSR создавали в IIS («Create Certificate Request») или когда-то импортировали PFX.
Как это работает: скрипт PowerShell забирает новый сертификат по ссылке, кладёт его в хранилище компьютера и связывает с ключом, который там уже есть (certutil -repairstore). Если ключа к новому сертификату на сервере нет, скрипт ничего не меняет. Затем он привязывает новый сертификат ко всем HTTPS-привязкам сайта в IIS.
Что понадобится
- Ссылка на сертификат из кабинета:
https://api.zrazu.com/ssl-pull/zsp_ВАШ_ТОКЕН. - Вход на сервер с правами администратора.
- Название сайта в IIS (как в IIS Manager → Sites), например
Default Web Site.
Шаг 1. Первая установка (если сертификат ещё не стоит)
Если CSR создавали в IIS: IIS Manager → сервер → Server Certificates → Complete Certificate Request → файл cert.pem из https://api.zrazu.com/ssl-pull/zsp_ВАШ_ТОКЕН/cert.pem. Если ключ у вас файлом — соберите PFX в кабинете (карточка сертификата → «Файлы» → PFX) и импортируйте: Server Certificates → Import. Затем Sites → сайт → Bindings → https → SSL certificate.
Шаг 2. Скрипт
Откройте PowerShell от имени администратора и создайте файл:
New-Item -ItemType Directory -Force -Path "$env:ProgramFiles\ZRAZU" | Out-Null
notepad "$env:ProgramFiles\ZRAZU\zrazu-ssl.ps1"В Блокнот вставьте текст ниже, в строке $Site укажите название своего сайта в IIS, сохраните.
# ZRAZU: обновление SSL-сертификата в IIS по личной ссылке. Запускается Планировщиком раз в сутки.
$ErrorActionPreference = "Stop"
$Url = "https://api.zrazu.com/ssl-pull/zsp_ВАШ_ТОКЕН"
$Site = "Default Web Site"
$Dir = Join-Path $env:ProgramFiles "ZRAZU"
$CertFile = Join-Path $Dir "cert.cer"
$ChainFile = Join-Path $Dir "chain.cer"
Invoke-WebRequest -Uri "$Url/cert.pem" -OutFile $CertFile -UseBasicParsing
Invoke-WebRequest -Uri "$Url/chain.pem" -OutFile $ChainFile -UseBasicParsing
$New = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($CertFile)
# Уже импортирован — не импортируем повторно, но привязку проверяем: вчера импорт мог пройти, а привязка — нет.
$Have = Test-Path "Cert:\LocalMachine\My\$($New.Thumbprint)"
if (-not $Have) {
Import-Certificate -FilePath $ChainFile -CertStoreLocation Cert:\LocalMachine\CA | Out-Null
Import-Certificate -FilePath $CertFile -CertStoreLocation Cert:\LocalMachine\My | Out-Null
certutil -repairstore my $New.Thumbprint | Out-Null
}
$Mine = Get-Item "Cert:\LocalMachine\My\$($New.Thumbprint)"
if (-not $Mine.HasPrivateKey) {
if (-not $Have) { Remove-Item $Mine.PSPath }
throw "ZRAZU: ключа к этому сертификату на сервере нет — сертификат не заменён"
}
Import-Module WebAdministration
foreach ($Binding in Get-WebBinding -Name $Site -Protocol https) {
if ($Binding.certificateHash -ne $New.Thumbprint) { $Binding.AddSslCertificate($New.Thumbprint, "My") }
}
$Until = $New.NotAfter.ToString('yyyy-MM-dd')
if ($Have) { "ZRAZU: сертификат не изменился, действует до $Until" } else { "ZRAZU: новый сертификат установлен, действует до $Until" }Запустите один раз вручную:
powershell -NoProfile -ExecutionPolicy Bypass -File "$env:ProgramFiles\ZRAZU\zrazu-ssl.ps1"Шаг 3. Расписание
schtasks /Create /F /SC DAILY /ST 04:17 /RU SYSTEM /TN "ZRAZU SSL" /TR "powershell -NoProfile -ExecutionPolicy Bypass -File \"C:\Program Files\ZRAZU\zrazu-ssl.ps1\""Задание появится в Task Scheduler → Task Scheduler Library → ZRAZU SSL и будет запускаться каждый день в 04:17 от имени системы.
Проверка
- Ручной запуск пишет «новый сертификат установлен» или «сертификат не изменился».
- IIS Manager → Sites → сайт → Bindings → https — выбран сертификат с новой датой.
- Сайт: https://zrazu.com/tools/ssl/example.com/.
- Результат ежедневных запусков — Task Scheduler → ZRAZU SSL → History (столбец Last Run Result:
0x0— успех).
Если не получилось
- «ключа к этому сертификату на сервере нет» — сертификат выпущен на ключ, которого нет на этом сервере (перевыпуск с новым ключом или CSR создавали в другом месте). Импортируйте PFX с новым ключом (шаг 1).
running scripts is disabled— запускайте именно так, как в шагах 2–3: с-ExecutionPolicy Bypass.(404) Not Found— ссылка отключена или заменена: создайте новую в карточке сертификата и замените$Url.- Сайт на IIS 8 / Windows Server 2012 — обновите сервер: эта версия Windows больше не получает обновлений безопасности.