# Windows Server і IIS

> Завдання Планувальника Windows раз на добу забирає свіжий сертифікат, прив'язує його до ключа в сховищі Windows і до сайту IIS.

URL: https://zrazu.com/docs/ssl-auto-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 від імені адміністратора** і створіть файл:

```powershell
New-Item -ItemType Directory -Force -Path "$env:ProgramFiles\ZRAZU" | Out-Null
notepad "$env:ProgramFiles\ZRAZU\zrazu-ssl.ps1"
```

У Блокнот вставте текст нижче, у рядку `$Site` вкажіть назву свого сайту в IIS, збережіть.

```powershell file=zrazu-iis-update.ps1
# 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
powershell -NoProfile -ExecutionPolicy Bypass -File "$env:ProgramFiles\ZRAZU\zrazu-ssl.ps1"
```

## Крок 3. Розклад

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