DEV Community

Андрей Викулов (VProger)
Андрей Викулов (VProger)

Posted on • Originally published at viku-lov.ru on

SSL в BitrixVM на CentOS: создание и продление Let's Encrypt по шагам

SSL в BitrixVM на CentOS: создание и продление Let's Encrypt по шагам

SSL в BitrixVM на CentOS: создание и продление Let's Encrypt по шагам

На BitrixVM без SSL браузер помечает сайт как небезопасный ; если сертификат просрочен — страницы перестают открываться по HTTPS. В дистрибутиве уже есть всё необходимое для работы с Let's Encrypt: остаётся корректно установить certbot, выпустить сертификат и подключить его в nginx. Ниже — по шагам, с примерами команд и конфигов.


Как устроен SSL в BitrixVM

Структура в BitrixVM такая:

  • конфигурации сайтов nginx лежат в каталоге

/etc/nginx/bx/site_avaliable/

(в дистрибутиве папка называется именно так — с опечаткой в слове «available»);

  • подключение SSL для домена идёт через файл

bx_ext_ssl_ДОМЕН.conf;

  • сами сертификаты Let's Encrypt после выпуска лежат в

/etc/letsencrypt/live/ДОМЕН/.


Шаг 1. Установка certbot

Установи пакет и убедись, что certbot доступен в PATH:


yum install certbot -y

which certbot

Enter fullscreen mode Exit fullscreen mode

Ожидаемый вывод — путь к бинарнику, например /usr/bin/certbot.


Шаг 2. Выпуск сертификата (webroot — рекомендуемый способ для BitrixVM)

Способ webroot не трогает настройки nginx и подходит для BitrixVM: certbot кладёт challenge в каталог сайта, nginx отдаёт его по запросу от Let's Encrypt.

Сначала узнай, под каким именем домена лежит сайт:


ls /home/bitrix/ext\_www/

Enter fullscreen mode Exit fullscreen mode

Подставь свой домен вместо example.com в команду ниже. Пример для домена example.com и www.example.com:


certbot certonly \

--webroot \

-w /home/bitrix/ext\_www/example.com/public\_html \

-d example.com \

-d www.example.com \

--email admin@example.com \

--agree-tos \

--non-interactive

Enter fullscreen mode Exit fullscreen mode

При успехе в конце будет сообщение вроде «Successfully received certificate». Убедиться, что сертификат создан, можно так:


ls -la /etc/letsencrypt/live/example.com/

Enter fullscreen mode Exit fullscreen mode

Должны быть файлы fullchain.pem и privkey.pem. Готовый сниппет с командами и проверкой challenge: Certbot: webroot в BitrixVM.


Шаг 3. Создание SSL-конфига nginx

Создай файл конфигурации SSL (подставь свой домен вместо example.com):


nano /etc/nginx/bx/conf/ssl.example.com.conf

Enter fullscreen mode Exit fullscreen mode

Минимальный рабочий вариант:


Редирект HTTP -> HTTPS при прямом заходе на 443 по HTTP

error\_page 497 https://$host$request\_uri;

ssl\_certificate /etc/letsencrypt/live/example.com/fullchain.pem;

ssl\_certificate\_key /etc/letsencrypt/live/example.com/privkey.pem;

ssl\_session\_cache shared:SSL:10m;

Enter fullscreen mode Exit fullscreen mode

Сохрани файл и закрой редактор.


Шаг 4. Подключение SSL к сайту

Нужно подключить этот конфиг в виртуальном хосте сайта. Открой файл для твоего домена (в BitrixVM он лежит в site_avaliable):


nano /etc/nginx/bx/site\_avaliable/bx\_ext\_ssl\_example.com.conf

Enter fullscreen mode Exit fullscreen mode

Добавь в нужный блок server (обычно в тот, где listen 443 ssl;) одну строку:


include bx/conf/ssl.example.com.conf;

Enter fullscreen mode Exit fullscreen mode

Пример фрагмента после правки:


server {

listen 443 ssl;

server\_name example.com www.example.com;

include bx/conf/ssl.example.com.conf;

... остальные директивы сайта

}

Enter fullscreen mode Exit fullscreen mode

Подробнее: Nginx в BitrixVM: SSL для Let's Encrypt.


Шаг 5. Проверка конфигурации и перезагрузка nginx

Проверь синтаксис и примени изменения:


nginx -t

systemctl reload nginx

Enter fullscreen mode Exit fullscreen mode

Если nginx -t выводит «syntax is ok» и «test is successful», после reload сайт должен открываться по HTTPS.


Продление SSL (обязательная часть настройки)

Сертификаты Let's Encrypt действуют 90 дней. Без настроенного продления через пару месяцев HTTPS перестанет работать, и придётся вручную обновлять сертификат. Ниже — как проверить продление и включить его по расписанию.


Проверка, что продление сработает

Перед тем как полагаться на cron, убедись, что продление в принципе проходит:


certbot renew --dry-run --deploy-hook "echo OK"

Enter fullscreen mode Exit fullscreen mode

Команда не меняет сертификат, а лишь имитирует процесс. Если в выводе появится OK от deploy-hook и не будет ошибок — продление настроено верно.


Ручное продление с перезагрузкой nginx

Если нужно принудительно обновить сертификат и сразу перезагрузить nginx (например, после смены домена или для проверки):


certbot renew --force-renewal --deploy-hook "systemctl reload nginx"

Enter fullscreen mode Exit fullscreen mode

В обычной работе эту команду вызывать не обязательно — достаточно автоматического продления по cron.


Автоматическое продление через cron (рекомендуется)

Чтобы certbot сам продлевал сертификат и перезагружал nginx, добавь задачу в crontab root:


EDITOR=nano crontab -e

Enter fullscreen mode Exit fullscreen mode

Строка ниже запускает проверку продления каждый день в 03:00 и при успешном обновлении выполняет systemctl reload nginx:


0 3 \* /usr/bin/certbot renew --quiet --deploy-hook "systemctl reload nginx" >/dev/null 2>&1

Enter fullscreen mode Exit fullscreen mode

Если перенаправляешь вывод в лог (например, для отладки), можно использовать:


0 3 \* /usr/bin/certbot renew --quiet --deploy-hook "systemctl reload nginx" >> /var/log/le-renew.log 2>&1

Enter fullscreen mode Exit fullscreen mode

Проверить, что задача выполнилась, можно по логам:


tail -20 /var/log/le-renew.log

Enter fullscreen mode Exit fullscreen mode

Отдельный сниппет с командами и вариантами cron: Certbot: продление и cron с deploy-hook.


Краткая проверка статуса nginx и certbot

Убедиться, что nginx запущен и certbot доступен:


systemctl status nginx

which certbot

Enter fullscreen mode Exit fullscreen mode

Типовая ошибка №1 — ACME challenge не открывается

Let's Encrypt проверяет домен по URL вида http://домен/.well-known/acme-challenge/.... Если nginx не отдаёт этот каталог или путь к webroot указан неверно, выпуск сертификата падает с ошибкой проверки.

Проверить доступность каталога вручную (подставь свой домен):


mkdir -p /home/bitrix/ext\_www/example.com/public\_html/.well-known/acme-challenge

echo test > /home/bitrix/ext\_www/example.com/public\_html/.well-known/acme-challenge/test.txt

chown -R bitrix:bitrix /home/bitrix/ext\_www/example.com/public\_html/.well-known

curl -s http://example.com/.well-known/acme-challenge/test.txt

Enter fullscreen mode Exit fullscreen mode

В ответе должно быть слово test. Если пусто или 404 — проверь путь в -w у certbot и конфиг nginx для этого сайта. Сниппет с проверкой challenge и срока сертификата: Certbot: проверка ACME и дат сертификата.


Типовая ошибка №2 — сертификат обновился, а сайт отдаёт старый

После успешного certbot renew nginx продолжает использовать старые файлы, пока не перечитать конфигурацию. Достаточно перезагрузить nginx без остановки обслуживания:


systemctl reload nginx

Enter fullscreen mode Exit fullscreen mode

Имеет смысл вызывать reload из --deploy-hook, как в примере с cron выше.


Проверка срока действия сертификата по HTTPS

Убедиться, какие даты у сертификата, который реально отдаёт сервер (подставь свой домен):


echo | openssl s\_client -servername example.com -connect example.com:443 2>/dev/null \

| openssl x509 -noout -dates

Enter fullscreen mode Exit fullscreen mode

Вывод покажет notBefore и notAfter — срок действия текущего сертификата.


Чеклист перед обращением в поддержку

Если HTTPS не поднимается или продление не срабатывает, по пунктам проверь:

  • [] certbot установлен (which certbot выводит путь)
  • [] сертификат выпущен и лежит в /etc/letsencrypt/live/ТВОЙ_ДОМЕН/
  • [] создан файл ssl.ТВОЙ_ДОМЕН.conf в /etc/nginx/bx/conf/
  • [] этот файл подключён через include в bx_ext_ssl_ТВОЙ_ДОМЕН.conf
  • [] после правок выполнен nginx -t и systemctl reload nginx
  • [] в crontab root есть задача на certbot renew с --deploy-hook "systemctl reload nginx"
  • [] команда certbot renew --dry-run выполняется без ошибок

Итог

В BitrixVM настройка SSL по Let's Encrypt сводится к одному разу: установить certbot, выпустить сертификат методом webroot, создать SSL-конфиг nginx, подключить его в виртуальном хосте и настроить автоматическое продление через cron. После этого схема certbot webroot + include в nginx + cron renew годами работает без ручного вмешательства.


Связанные сниппеты

  • Certbot: выпуск сертификата через webroot в BitrixVM — команда certonly, проверка ACME challenge
  • Nginx в BitrixVM: SSL-конфиг для Let's Encrypt — конфиг и include в виртуальном хосте
  • Certbot: продление и cron с deploy-hook для nginx — renew, dry-run, crontab
  • Certbot: проверка ACME challenge и срока сертификата — диагностика выпуска и дат по openssl

Read more on viku-lov.ru

Top comments (0)