bitrix Let’s Encrypt +Виртуальная машина 6 автоматическая генерация ssl

Как мы все знаем яндекс и гугл уже давно требуют ssl сертификаты на сайты. И даже есть сервис предназначенные для генерации сертификатов которые вполне себе валидно работают.

Уже много статей написано как пользоваться сервисом Let’s Encrypt, и множество мануалов. Я решил пойти дальше и автоматизировать процесс полностью для сайтов Битрикс на Битрикс Виртуальных машинах.

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

Указываете ваш домен в конфиге, запускаете, и сайт работает с сертификатом на https.

#!/bin/bash
######### тут указываем совой домен #########################################################################

DOMAIN=shop.wildorchid.ru
EMAIL=vtaran@wildorchid.ru

#############################################################################################################
#ставим гит, если его нет
rpm -q git || yum install git && echo "А гит уже стоит и мы его пропускаем"
# в этой папке и будет лежать сам дистрибутивчик cetbot, он нам нужен будет потом для  обновления ключиков.
cd /root
#проверяем  не скачан ли он уже и качаем если нет.
test -d certbot && echo "Каталог уже есть, ниче не качаем" || git clone https://github.com/certbot/certbot
cd certbot

# Выставляем права  на файл
chmod a+x ./certbot-auto || echo "проблема  правами на файл" && echo "Права  на файл поменяли успешно"


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


# создаем место для ключика  dhparam
test -d /etc/pki/nginx || mkdir /etc/pki/nginx

# ставим openssl 
rpm -q openssl || yum install openssl && echo "openssl уже стоит, пропускаем..." 
echo " ЭТОТ КЛЮЧЬ ГЕНЕРИРУЕТСЯ 1 РАЗ НА ВЕСЬ СЕРВЕР И  ДАЛЕЕ БУДЕТ ПРОПУСКАТЬСЯ!"
echo "Откиньтесь на спинку кресла и  подождите, это минимум минут на 5"
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_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 "замена  в конфигах прошал  без ошибок"

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

#certbot-auto renew
#проверяем нет ли записи в кроне и добавляем ее  
echo "Записываем Автообновление сертификатов  крон"
crontab -l | grep -q "\* \*/12 \* \* \*   cd /root/certbot/ \&\& \./certbot-auto renew \/etc\/init.d\/nginx restart >> /dev/null 2>\&1 "  && echo "А в кроне уже запись есть, ничего не добавляем" || echo "* */12 * * *   cd /root/certbot/ && ./certbot-auto renew >> /dev/null 2>&1 "  >> /var/spool/cron/root  

echo "не забывайте про редиректы которые могут вести на http!!!!!!!!"

Rаждые 12 часов будет пытаться обновиться сертификаты (если они валидные ничего не происходит).
Как они просочатся, то автоматически пере выпустятся.
Теперь у нас все работает, осталось повысить качество сертификата до А+

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

openssl dhparam -out /etc/pki/nginx/dhparam.pem 4096 

А сюда мы его ложим

ssl_dhparam /etc/pki/nginx/dhparam.pem; 

Теперь проверяем класс сертификата, и убеждаемся что у нас А +


Сервис по проверки качества сертификата
Конец


Дополнительная информация

Так же на одном из серверов вылезла ошибка пакета в следствие чего не смог установиться LetsEncrypt

Вот такая: Could not install OS dependencies. Aborting bootstrap!
Лечится достаточно легко

package-cleanup --dupes
package-cleanup --cleandupes 
package-cleanup --problems
yum update python

Генератор конфигурации для разных веб серверов, включая версионность: https://mozilla.github.io/server-side-tls/ssl-config-generator/

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

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

  1. Сергей 24.04.2017 Ответить
    Здравствуйте подскажите пожалуйста ... а если несколько сайтов ... как прописывать -

    ######### тут указываем совой домен #########################################################################

    DOMAIN=shop.wildorchid.ru
    EMAIL=vtaran@wildorchid.ru

    #############################################################################################################
  2. Виктор
    Виктор 26.04.2017 Ответить
    просто меняете имя домена и запускаете заново.
    На сервере как правило мало сайтов до десятка.
    Конечно можно сделать изменения
    например читать папку /home/bitrix и циклом подставлять их.
    Но есть ли смысл ?
  3. Андрей 13.05.2017 Ответить
    Наверное, есть смысыл, если нужно чтобы обновлялись по крону?
  4. Виктор
    Виктор 25.05.2017 Ответить
    Наверное нет, поскольку скрипт автоматически закидывает домен в крон на обновление.
    Так что все что вам нужно это в скрипте указать имя домена интер имя домена интер и конец.
    Все сделано и в кроне все лежит.
  5. Андрей 13.05.2017 Ответить
    Ошибка: Multilib version problems found. This often means that the root
    cause is something else and multilib version checking is just
    pointing out that there is a problem. Eg.:

    1. You have an upgrade for openssl which is missing some
    dependency that another package requires. Yum is trying to
    solve this by installing an older version of openssl of the
    different architecture. If you exclude the bad architecture
    yum will tell you what the root cause is (which package
    requires what). You can try redoing the upgrade with
    --exclude openssl.otherarch ... this should give you an error
    message showing the root cause of the problem.

    2. You have multiple architectures of openssl installed, but
    yum can only see an upgrade for one of those arcitectures.
    If you don't want/need both architectures anymore then you
    can remove the one with the missing update and everything
    will work.

    3. You have duplicate versions of openssl installed already.
    You can use "yum check" to get yum show these errors.

    ...you can also use --setopt=protected_multilib=false to remove
    this checking, however this is almost never the correct thing to
    do as something else is very likely to go wrong (often causing
    much more problems).

    Protected multilib versions: openssl-1.0.1e-57.el6.x86_64 != openssl-1.0.1e-42.el6_7.4.i686
    Could not install OS dependencies. Aborting bootstrap!
    Не угадали с каталогом, проверяем пути

    При этом не создается папка /etc/letsencrypt. Может в этом проблема?

    А еще в конце такая ошибка:
    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
  6. Андрей 13.05.2017 Ответить
    Вроде разобрался. Только крон не записался. И вот с этим не понятно:
    А сюда мы его ложим

    ssl_dhparam /etc/pki/nginx/dhparam.pem;
  7. Виктор
    Виктор 25.05.2017 Ответить
    ключей на сайте 2
    1. Ключике домена и ключик для dhparam
    первй всегда создается для домена.
    Второй 1 на весь сервер собственно мы туда его и ложем.
  8. Андрей 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
  9. Виктор
    Виктор 11.02.2019 Ответить
    ".pem','r" - сдается мне что у вас ошибка тут !