# Хостинг із cPanel — сертифікат оновлюється сам

> Задача cron у cPanel раз на добу забирає свіжий сертифікат і ставить його на сайт через вбудований інструмент cPanel. SSH не потрібен.

URL: https://zrazu.com/docs/ssl-auto-cpanel/

Підходить для хостингу з панеллю cPanel: Hostiq, Hostpro, Ukrnames, GoDaddy, Namecheap, частина тарифів NIC.UA та багато інших. Ознака cPanel — у панелі є розділи «Files», «Security», «Advanced», а адреса входу часто закінчується на `:2083`. Доступ по SSH не потрібен, усе робиться мишею в панелі.

Ваш закритий ключ зберігається в самій cPanel і в скрипт не потрапляє: cPanel сама підбирає до нового сертифіката ключ, з яким сертифікат ставили вперше.

## Що знадобиться

- Посилання на сертифікат із кабінету: `https://api.zrazu.com/ssl-pull/zsp_ВАШ_ТОКЕН`.
- У cPanel — пункт **Cron Jobs** у розділі «Advanced». Якщо його немає, тариф не дозволяє задач за розкладом: напишіть хостеру або перейдіть на [ручне оновлення](https://zrazu.com/docs/ssl-auto-panels-manual.md).
- 10 хвилин.

## Крок 1. Перше встановлення (якщо сертифікат ще не стоїть)

1. Відкрийте **Security → SSL/TLS → Manage SSL sites**.
2. У полі **Domain** оберіть example.com.
3. **Certificate (CRT)** — вставте вміст `https://api.zrazu.com/ssl-pull/zsp_ВАШ_ТОКЕН/cert.pem` (відкрийте посилання в браузері і скопіюйте весь текст).
4. **Private Key (KEY)** — ваш закритий ключ. Якщо CSR створювали в цій cPanel, ключ підставиться сам після вставки сертифіката.
5. **Certificate Authority Bundle (CABUNDLE)** — вміст `https://api.zrazu.com/ssl-pull/zsp_ВАШ_ТОКЕН/chain.pem`.
6. Натисніть **Install Certificate**.

Після цього ключ збережено в cPanel, і далі сертифікат оновлюватиметься без нього.

## Крок 2. Скрипт оновлення

1. Відкрийте **Files → File Manager**. Ви в домашній теці (зліва вгорі вибрано `/home/…`). **Не** заходьте в `public_html` — скрипт не має бути доступний із сайту.
2. **+ Folder** → назва `zrazu-ssl` → **Create New Folder**. Зайдіть у неї.
3. **+ File** → назва `update.sh` → **Create New File**. Виділіть файл → **Edit**, вставте текст нижче і натисніть **Save Changes**.

```sh file=zrazu-cpanel-update.sh
#!/bin/sh
# ZRAZU: оновлення SSL у cPanel за особистим посиланням. Запускається cron раз на добу.
set -eu
PULL="https://api.zrazu.com/ssl-pull/zsp_ВАШ_ТОКЕН"
DOMAIN="example.com"
UAPI=/usr/local/cpanel/bin/uapi
cd "$HOME/zrazu-ssl"

curl -fsS --retry 3 --max-time 60 -o cert.new "$PULL/cert.pem"
curl -fsS --retry 3 --max-time 60 -o chain.new "$PULL/chain.pem"
grep -q "BEGIN CERTIFICATE" cert.new || { echo "ZRAZU: за посиланням не сертифікат"; exit 1; }
if [ -f cert.applied ] && cmp -s cert.new cert.applied; then
  echo "ZRAZU: сертифікат не змінився"
  rm -f cert.new chain.new
  exit 0
fi
enc() { perl -0777 -pe 's/([^A-Za-z0-9_.~-])/sprintf("%%%02X", ord($1))/seg' "$1"; }
out=$("$UAPI" --output=json SSL install_ssl domain="$DOMAIN" cert="$(enc cert.new)" cabundle="$(enc chain.new)")
if printf '%s' "$out" | grep -Eq '"status" *: *1'; then
  mv -f cert.new cert.applied
  rm -f chain.new
  echo "ZRAZU: новий сертифікат встановлено"
else
  echo "ZRAZU: cPanel не встановила сертифікат, відповідь:"
  printf '%s\n' "$out"
  exit 1
fi
```

4. Виділіть `update.sh` → **Permissions** → поставте `700` → **Change Permissions**.

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

1. Відкрийте **Advanced → Cron Jobs**.
2. **Cron Email** можна вказати свою пошту — тоді про кожну помилку прийде лист.
3. У **Add New Cron Job** → **Common Settings** оберіть **Once Per Minute** (це лише для першої перевірки, у кроці 4 змінимо).
4. **Command**:

```sh
/bin/sh $HOME/zrazu-ssl/update.sh >> $HOME/zrazu-ssl/log.txt 2>&1
```

5. **Add New Cron Job**.

## Крок 4. Перевірка

1. Зачекайте 2 хвилини і відкрийте у File Manager `zrazu-ssl/log.txt`. Має бути «новий сертифікат встановлено», а далі — «сертифікат не змінився».
2. Поверніться в **Cron Jobs**, у списку задач натисніть **Edit** і змініть **Common Settings** на **Once Per Day**. Збережіть.
3. Перевірте сайт: [https://zrazu.com/tools/ssl/example.com/](https://zrazu.com/tools/ssl/example.com/) — сертифікат ZRAZU і дата закінчення.

## Щоб хостинг не замінив наш сертифікат

Багато хостингів на cPanel самі ставлять безкоштовний сертифікат (AutoSSL). Наш він за замовчуванням не чіпає, але якщо хостер це дозволив — відкрийте **Security → SSL/TLS Status**, позначте example.com і `www.example.com` і натисніть **Exclude Domains from AutoSSL**.

## Якщо не вийшло

- У журналі `uapi: not found` чи `Permission denied` — хостинг закрив інструмент cPanel для скриптів. Тоді в **Security → Manage API Tokens** створіть токен, а в скрипті замініть рядок з `out=$(…)` на цей (ЛОГІН — ім'я входу в cPanel, СЕРВЕР — адреса, за якою ви заходите в cPanel, без `:2083`):

```sh
out=$(curl -fsS -H "Authorization: cpanel ЛОГІН:ТОКЕН" "https://СЕРВЕР:2083/execute/SSL/install_ssl" --data-urlencode "domain=$DOMAIN" --data-urlencode "cert@cert.new" --data-urlencode "cabundle@chain.new")
```

- «cPanel не встановила сертифікат» і в відповіді про ключ (`private key`) — у cPanel немає ключа до цього сертифіката. Повторіть крок 1 зі своїм ключем.
- `curl: (22) … 404` — посилання вимкнене чи замінене: створіть нове в картці сертифіката і замініть рядок `PULL`.
