# Windows Server и IIS

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

URL: https://zrazu.com/ru/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 больше не получает обновлений безопасности.
