# Хостинг с cPanel — сертификат обновляется сам

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

URL: https://zrazu.com/ru/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/ru/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`.
