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"

Теперь осталось подключить 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

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

  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 в конфигурационном файле с англоязычного домена, подставьте правильные ключи.


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