SSL на Битрикс виртуальной машине 7 с помощью Let’s Encrypt

Автоматическая генерация SSL ключей в Битрикс Bitrix virtual appliance version 7.0.1

Недавно я написал статью по этому поводу для старых битрикс ВМ на centos 6. Но время идет и centos 7 уже поддерживается ВМ битрикс. А в купе с ним и Let’s Encrypt добавлен в официальные репозитории, включая утилиту certbot Соответственно пришлось переделывать скрипт, я его облегчил до максимума.

И так имеем:
Bitrix virtual appliance version 7.0.1
PHP 7.1.6 - ( апнут руками с 7)
Nginx - не ниже 1.10.1 (для http2)

Задача:
Перевести сайт на https
Дать сайтам валидные сертификаты А класса
Автоматическая замена устаревших сертификатов.
Подключение http2 (опционально - работает только с SSL)

#!/bin/bash
######### тут указываем совой домен #########################################################################
DOMAIN=mfwo.ru
EMAIL=vtaran@wildorchid.ru
ROOT=home/bitrix/ext_www
#############################################################################################################
yum -y install yum-utils
yum-config-manager --enable rhui-REGION-rhel-server-extras rhui-REGION-rhel-server-optional
rpm -q certbot || yum install epel-release
rpm -q certbot || yum install certbot

# проверяем верен ли путь до сайта, и не генерирование ли уже ключик, если все ок генерим!
test -d /$ROOT/$DOMAIN  || echo "/$ROOT/$DOMAIN -нет такой директории"  && test -f /etc/letsencrypt/live/$DOMAIN/fullchain.pem && echo "А файл уже есть, не не генерируем новый !" || 
certbot certonly --webroot --agree-tos --email $EMAIL -w /$ROOT/$DOMAIN -d $DOMAIN -d www.$DOMAIN || echo "А не угадали с каталогом, проверяем пути" &&

# создаем место для ключика  dhparam
test -d /etc/pki/nginx || mkdir /etc/pki/nginx
test -f /etc/pki/nginx/dhparam.pem && echo "файл /etc/pki/nginx/dhparam.pem уже есть, пропускаем его" || openssl dhparam -out /etc/pki/nginx/dhparam.pem 4096  


# добавляем все в конфиг  сайта  /etc/nginx/bx/site_avaliable/bx_ext_ssl_$DOMAIN.conf
sed -i '\| include bx/conf/ssl.conf| {  s|include bx/conf/ssl.conf|#&|; a\
 ssl_stapling on;\
 ssl_certificate /etc/letsencrypt/live/'$DOMAIN'/fullchain.pem;\
 ssl_certificate_key /etc/letsencrypt/live/'$DOMAIN'/privkey.pem;\
 ssl on;\
 keepalive_timeout 70;\
 keepalive_requests 150;\
 ssl_session_cache shared:SSL:10m;\
 ssl_session_timeout 10m;\
 ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';\
 ssl_prefer_server_ciphers on;\
 ssl_dhparam /etc/pki/nginx/dhparam.pem;\
 ssl_session_cache       shared:SSL:10m;\
 ssl_protocols  TLSv1.1 TLSv1.2;\
 add_header Strict-Transport-Security "max-age=31536000;";\
  #add_header Content-Security-Policy-Report-Only "default-src https:; script-src https: 'unsafe-eval' 'unsafe-inline'; style-src https: 'unsafe-inline'; img-src https: dat a:; font-src https: dat a:; report-uri /csp-report";
}' /etc/nginx/bx/site_avaliable/bx_ext_ssl_$DOMAIN.conf && echo "замена  в конфигах прошла  без ошибок"

# перед рестартом  проверяем валидность конфигов, если все хорошо,  рестартуем.
nginx -t && echo "Nginx  валидно завершил проверку конфигов" && service nginx restart 

echo "Записываем Авто обновление сертификатов  крон, проверка за 30 дней до окончания"
crontab -l | grep -q "0 \*/12 \* \* \* certbot renew --quiet && nginx -s reload >> /dev/null 2>&1"  && echo "А в кроне уже запись есть, ничего не добавляем" || echo "0 */12 * * * certbot renew —quiet && nginx -s reload >> /dev/null 2>&1" >> /var/spool/cron/root

Теперь осталось подключить http2  Для этого вам нужно заменить в файле


/etc/nginx/bx/site_avaliable/bx_ext_ssl_ВАШСАЙТ.ru.conf 
Строку
listen 443 ssl; 
На
listen 443 ssl http2; 

service nginx restart 


Ну и на подлесок,не забывайте что https2 в работает частично и не распространится на apache2, следовательно час контента все еще будет отдаваться по http1.
Проверить это легко. В хроме открыть инспектор - сеть  - и добавить колонку "Protocol"
Определить поддержку сайтом протокола HTTP/2
После этого будет видно кто и что отдает.
Поддерживает ли сайт HTTP2

Если у вас возникли проблемы с генерацией сертификата то можно запустить ее в ручную и посмотреть что именно не устроило letsencrypt для этого можно сэмитировать генерацию сертификата, при этом попытка не будет засчитана за реальную а значит, количество этих попыток в день не умен7ьшится.

certbot certonly --dry-run --webroot -w /var/www/letsencrypt -d example.com -d www.example.com
Для Ispconfig3
certbot certonly --dry-run --webroot -w /usr/local/ispconfig/interface/acme/ -d ecodream.ru

Комментарии (16)

  1. Andrew 27.06.2017 Ответить
    На последней виртуальной машине часть скрипта выкидывает ошибку:
    sed: can't read /etc/nginx/bx/site_avaliable/bx_ext_ssl_домен.conf: No such file or directory
  2. Виктор
    Виктор 28.06.2017 Ответить
    Эта папка неизменна уже многие годы, и соответственно наличие данного конфига тоже.
    Единственный вариант при котором это не сработает, если вы решили поставить сайт в папку по умолчанию www, чего естественно делать категорически нельзя и для этого есть целая уйма причин.
    1. эта папка как /dev/null - только для запросов веб сервера, по сути это мусорка, все что не смогло разобраться лезет в нее, как следствие ЛЮБОЙ кто пропишет А запись на этот сервер сможет пользоваться сайтом, в свое время даже сайт 1с-битрикс такой шляпой грешил.
    По этому НИКОГДА не ставьте сайт в эту папку. Сюда же пойдут все зеркала такие как айпи, технические домены, удаленые сайты с сервера но не удалённые а записи и тд и тп. Все для чего эта папка может быть полезна так это для .htaccess, когда вам нужно сделать кучу редиректов с других доменов а сделать это спомощью CHAME у вас нет возможности, а алиасы Битрикс Вм создавать не умеет.
    В таком случае Просто прописав А запись на этот сервер, в папке ввв вы можите положить один .htaccess который разведет все домены куда нужно, не создавая папку для каждого из низ.


    2. Вы создали сайт через создать сайт имя домена, он создался валидно, тогда у вас есть этот файл, кстати легко проверить его наличие.
    если не получается, то давайте доступы до ssh , но уже не сюда а мне на личную почту shambler81@маил.ру
  3. Андрей 11.08.2017 Ответить
    Для домена .рф не работает?
  4. Виктор
    Виктор 16.08.2017 Ответить
    Кто-бы что не говорил, но домены рф никогда не работают.
    Как ни трудно догадаться проблема в PUNICODE который не учитывается разными демонами и скриптами.
    Создавая основное зеркало сайта на РФ вы должны четко понимать что обрекаете себя на вечный "геморрой" с подобными вещами.
    Оно конечно физически все работать будет. Но не всегда с коробки.
    1. генерируйте ключи для letsencrypt для домена в правильном название http://r01.ru/domain/whois/instruments/converter.php
    но вообще они должны уже поддерживать мультиязычные домены
    2. Скопируйте блок для ssl в конфигурационном файле с англоязычного домена, подставьте правильные ключи.

  5. Artur 06.04.2018 Ответить
    Благодарю. Всё получилось. Внес кое какие правки в директории в соответствии со своей конфигурацией и вуаля! Теперь подождем, чтобы посмотреть как будет проходить процесс обновления сертификата.
  6. Виктор
    Виктор 10.04.2018 Ответить
    По заявлению битрикс они включили генерацию ключей в стандартный функционал новой машины, но я не проверял.
  7. David 23.08.2018 Ответить
    Dobry Den
    Kak ustanovic SSL na bitrix24 korobochni kotori ustanovil na Virtual mashine Hyper V ?
    ne priviazan na Domain ili sub Domain. magu zaiti cherez IP adress.
  8. Виктор
    Виктор 23.08.2018 Ответить
    SSL сертификат не выдают на IP поскольку проверить его владельца значительно сложнее чем домен.
    LetsEncrypt выдает сертификаты только на доменные имена.
    Просто арендуйте домен или используйте домен 3 уровня.
  9. Александр 29.08.2018 Ответить
    А от куда запускать скрипт имеет значение или нет? Прям в корень его положить или может в какую-нить директорию определенную?
  10. Виктор
    Виктор 05.09.2018 Ответить
    Не имеет значения, скрипт сработает с любого места, но не имей привычку хоть что-то класть в корень, работай по умолчанию в /tmp
  11. Андрей 13.09.2018 Ответить
    такая ошибка:
    nginx: [emerg] BIO_new_file("/etc/letsencrypt/live/site.com/fullchain.pem") failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/etc/letsencrypt/live/site.com/fullchain.pem','r') error:2006D080:BIO routines:BIO_new_file:no such file)
    nginx: configuration file /etc/nginx/nginx.conf test failed
  12. Андрей 17.09.2018 Ответить
    C вашего позволения оставлю тут решение по своему вопросу:
    Перед запуском этого скрипта нужно предварительно запустить это:
    ./certbot-auto certonly --webroot --agree-tos --email мыло@мыло.ru -w /home/bitrix/ext_www/домен/ -d домен -d www.домен
    После этого скрипт срабатывает без ошибки. Почему — возможно, Виктор ответит
  13. Виктор
    Виктор 27.09.2018 Ответить
    думаю это объясняется куда как проще, у вас старая версия certbot и в vm6 ( смотрите ссылку выше) так и делается.
    в текущей же версии скрипта
    ./certbot-auto certonly --.....
    пишется как
    certbot certonly ....
  14. Андрей 19.10.2018 Ответить
    У меня версия 7.3-2, но почему-то и в этот раз даже с моим решением не сработало. Та же ошибка
  15. Александр 21.09.2018 Ответить
    Добрый день Виктор!
    У меня такая же ошибка как и у Андрея:
    IMPORTANT NOTES:
    - Congratulations! Your certificate and chain have been saved at:
    /etc/letsencrypt/live/site.ru/fullchain.pem
    Your key file has been saved at:
    /etc/letsencrypt/live/site.ru/privkey.pem
    Your cert will expire on 2018-12-20. To obtain a new or tweaked
    version of this certificate in the future, simply run certbot
    again. To non-interactively renew *all* of your certificates, run
    "certbot renew"
    - If you like Certbot, please consider supporting our work by:

    Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
    Donating to EFF: https://eff.org/donate-le

    файл /etc/pki/nginx/dhparam.pem уже есть, пропускаем его
    замена в конфигах прошла без ошибок
    nginx: [emerg] BIO_new_file("/etc/letsencrypt/live/site.com/fullchain.pem") failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/etc/letsencrypt/live/site.com/fullchain.pem','r') error:2006D080:BIO routines:BIO_new_file:no such file)
    nginx: configuration file /etc/nginx/nginx.conf test failed
    До этого установил Вашим скриптом сертификаты для 7 сайтов на этом сервере, все проходило гладко, без проблем.
    Может есть идеи, поделитесь приз.
  16. Виктор
    Виктор 27.09.2018 Ответить
    Александр, у вас тут написано все по русски
    run "certbot renew"
    так же не забывайте что в вм 7.3 уже вшит letsencrypt и в данной версии скрипт вовсе не нужен.

Оставить комментарий