SSL: автоматическое обновление

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

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

Обновляется сам

Подходит для хостинга с панелью 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». Если его нет, тариф не позволяет задач по расписанию: напишите хостеру или перейдите на ручное обновление.
  • 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.
#!/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
  1. Выделите 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:
/bin/sh $HOME/zrazu-ssl/update.sh >> $HOME/zrazu-ssl/log.txt 2>&1
  1. 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/ — сертификат 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):
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.

Эта страница в Markdown