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 від імені системи.

Перевірка

  1. Ручний запуск пише «новий сертифікат встановлено» або «сертифікат не змінився».
  2. IIS Manager → Sites → сайт → Bindings → https — обрано сертифікат із новою датою.
  3. Сайт: https://zrazu.com/tools/ssl/example.com/.
  4. Результат щоденних запусків — 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 більше не отримує оновлень безпеки.

Ця сторінка в Markdown