BitrixEnv и Let'sEncrypt SSL-Сертификаты

Эта статья является компиляцией моего руководства для установки в BitrixEnv SSL-сертификата от Comodoруководства на хабре про настройку Let's Encrypt для Bitrix в обычной LAMP-среде и руководства Let's Encrypt на CentOS7. К каждому домену сайта, кроме алиасов вида www.sub.example.com  к домену sub.example.com или www.example.com  к домену example.com, необходимо проводить операцию отдельно. Можно, конечно, выпустить сертификат единый для нескольких доменов, но на мой взгляд это усложнит администрирование.

Обращаю внимание, что описанный способ не имеет официальной поддержки BitrixVM и является только моей интерпритацией того, как это должно быть настроено, моё чувство прекрасного.

Let’s Encrypt — центр сертификации, начавший работу в бета-режиме с 3 декабря 2015 года, предоставляющий бесплатные криптографические сертификаты X.509 для TLS шифрования (HTTPS). Процесс выдачи сертификатов полностью автоматизирован (Источник).

Проводим настройку

Для начала зададим доменное имя, на которое будем получать сертификат:

SSLDOMAIN=example.com

Ставим официальный клиент Let'sEncrypt, CertBot с GitHub

cd /opt
git clone https://github.com/certbot/certbot

Пропишем certbot-auto в список системных утилит из сообращений удобства:

ln -s /opt/certbot/certbot-auto /usr/local/bin/certbot-auto

Сгенерируем сертификат:

#certbot-auto -d $SSLDOMAIN --nginx --agree-tos --email admin@$SSLDOMAIN

Тут выбираем Easy

Всё хорошо, если мы видим

 

Вообще, судя по тестам модуль nginx в certbot без проблем раотает с BitrixEnv, но если по каким-то причинам, вы не увидели сообщения, можно воспользоваться папкой публикации, но такой метод работает только с сайтами битрикс типа kernel:
#certbot-auto certonly -a webroot --webroot-path=/home/bitrix/ext_www/$SSLDOMAIN/ -d $SSLDOMAIN -d www.$SSLDOMAIN --agree-tos --email admin@$SSLDOMAIN

 

Проверяем, что сейчас конфиг nginx рабочий и никто его не испортил, пока что мы не производили никаких действий с сервером:

nginx -t

Ответ должен быть примерно таким:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Вносим конфигурацию в конфигурационный файл сайта

Можно сделать это sed'ом, но я такой специалист по нему, что не могу порекомендовать на продакшне
## sed -e "s/bx\/conf\/ssl.conf/ssl\/$SSLDOMAIN.conf/g" /etc/nginx/bx/site_enabled/bx_ext_ssl_$SSLDOMAIN.conf

открываем файл для редактирования

nano /etc/nginx/bx/site_enabled/bx_ext_ssl_$SSLDOMAIN.conf

Закомментируем строчку со ссылкой на стандартный файл ssl-конфигурации и добавим новую

#include bx/conf/ssl.conf;
include ssl/$SSLDOMAIN.conf

Создаём новый конфигурационный файл ssl для сайта:

echo "keepalive_timeout 70;
keepalive_requests 150;
ssl on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_ciphers kEECDH+AES128:kEECDH:kEDH:-3DES:kRSA+AES128:kEDH+3DES:DES-CBC3-SHA:!RC4:!aNULL:!eNULL:!MD5:!EXPORT:!LOW:!SEED:!CAMELLIA:!IDEA:!PSK:!SRP:!SSLv2:!EDH+aRSA;
ssl_certificate /etc/letsencrypt/live/$SSLDOMAIN/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/$SSLDOMAIN/privkey.pem;" > /etc/nginx/ssl/$SSLDOMAIN.conf

Данная конфигурация обеспечивает работу сертификата класса «А-» по результатам HTTPS-теста от SSLLabs

Проверяем, не содержит ли конфигурационный файл nginx ошибок

nginx -t

Перезапускаем nginx

service nginx restart

Добавляем в cron правило автоматического обновления сертификатов

echo "30 2 * * 1 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/letsencrypt-certbot-renew.log
35 2 * * 1 service nginx restart" >> /var/spool/cron/root

Эта команда создаст cron-задачу, которая каждый понедельник будет выполнять автоматическое продление letsencrypt сертификатов в 2:30 и перезагружать nginx в 2:35. Вся информация об обновлении будет логироваться в /var/log/letsencrypt-certbot-renew.log.

Наслаждаемся работающим SSL-сертификатом на вашем домене.

 

Такая конфигураця спокойно переживает обновление ОС, обновление BitrixEnv, создание, удаление новых доменов. В теории, ломаться ничего не должно.

Какие проблемы могут возникнуть при дальнейшей эксплуатации, чисто в теории?

  • Несрабатывание автопродление сертификата.
    Читаем ошибки /var/log/letsencrypt-certbot-renew.log
  • Пропадание SSL-сертификата либо подмена его на сертификат «по-умолчанию»
    Проверяем не изменился ли /etc/nginx/bx/site_enabled/bx_ext_ssl_$SSLDOMAIN.conf
  • Невозможность запуска nginx.
    По неведомой причине кто-то внёс изменения в файл /etc/nginx/ssl/$SSLDOMAIN.conf и разрушил его.

В ближайшее время я планирую затестировать данное решение на продакшне.