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 більше не отримує оновлень безпеки.