SSL сертификат: бесплатное получение и продление, wildcard на все поддомены

Решил обновить статью по получению и продлению бесплатных SSL сертификатов для сайтов на выделенном сервере. Пишу больше для себя, поэтому если возникнут вопросы - пишите в комментариях. Пользоваться будем сервисом letsencrypt.org. На их сайте рекомендуется использовать клиента Certbot. В качестве web сервера у меня nginx, соответственно будем использовать его для подтверждения хоста при получении сертификата.

Установка клиента

Вы можете самостоятельно выбрать на сайте сертбота вашу операционку для добавления репозитория и дальнейшей установки через менеджер пакетов. Я буду использовать скрипт, он ставится на любую ОС, сам доустанавливает нужные пакеты и работает так же, как и любая другая версия.
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
./certbot-auto
В первый раз при запуске скрипт установит все зависимости для работы.

Получение SSL сертификата

В моем случае путь к скрипту:  /root/certbot-auto
Получим сертификат для сайта my-site.com. Чтобы не останавливать web-сервер в процессе получения и обновления мы будем использовать плагин webroot, для этого подправим настройки хоста в nginx (откроем доступ по ссылке my-site.com/.well-known/acme-challenge и направим её на нужную папку):
nano /etc/nginx/sites-enabled/my-site.com.conf
В секции server {} описывающей ваш сайт добавляем локейшн для нашей webroot папки (в неё сертбот будет класть свои файлы и удалять после завершения запроса):
# for certbot challenges
        location ~ /.well-known/acme-challenge/ {
            default_type "text/plain";
            allow all;
            root /var/www/html/;
        }
Можете ниже сделать редирект для остального на https версию прописав соответствующие настройки для https хоста в той же или новой секции:
location / {
            return 301 https://$host$request_uri;
        }
Далее создаем эту папку:
mkdir -p /var/www/html/.well-known/acme-challenge/
И запускаем получение SSL сертификата:
/root/certbot-auto certonly --webroot --webroot-path /var/www/html/ -d my-site.com
Если все прошло отлично, то в папке /etc/letsencrypt/live/my-site.com появятся 4 файла: cert.pem  chain.pem  fullchain.pem  privkey.pem. На самом деле это симлинки на созданные файлы, при обновлении пути останутся теми же для всех новых сертификатов. Подключить в nginx их можно как-то так:
ssl_certificate /etc/letsencrypt/live/my-site.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/my-site.com/privkey.pem;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_session_tickets off;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_stapling on;
ssl_stapling_verify on;
Обратите внимание на параметр ssl_dhparam. Для него нам нужно будет еще сгенерировать файл /etc/nginx/dhparam.pem:
openssl dhparam -out /etc/nginx/dhparam.pem 4096
Проверить правильность конечной настройки можно здесь, результаты должны быть A или A+.
Еще можете воспользоваться этим инструментом для генерации SSL конфига для вашего web сервера.

Автоматическое продление

Пишем в /etc/crontab примерно так:
08 30 * * * root /root/certbot-auto renew --webroot --webroot-path /var/www/html/ --cert-name my-site.com -q --post-hook "systemctl restart nginx.service"
Вместо systemctl restart nginx.service, можно использовать service nginx restart. Параметр -q отключает все сообщения. Можно добавить параметр --no-self-upgrade, чтобы запретить обновление скрипта при запуске (у меня обновления работают стабильно уже несколько лет). Скрипт будет выполняться каждый день в 8:30. Если до окончания сертификата осталось менее 30 дней, то сертификат будет обновлен автоматически.

Получение wildcard SSL сертификата

Будем получать один сертификат для всех поддоменов *.my-site.com. Такой тип сертификатов называется wildcard. Для его получения нужно подтвердить запрос созданием DNS записи (плагин webroot не подойдет). Поэтому продление такого сертификата в автоматическом режиме будет сопряжено с некоторыми трудностями, нужно искать или писать плагины, которые по API смогут автоматически вносить записи на DNS сервер. У меня такой возможности нет, поэтому будем все делать вручную.
/root/certbot-auto certonly -d *.my-site.com --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory --manual
В процессе получения мастер попросит добавить DNS запись TXT с именем _acme-challenge.my-site.com с указанным значением. После добавления записи ждем пару минут, нажимаем далее и получаем сертификат. Обновлять придется руками той же командой, либо с параметром renew вместо certonly, но в этом случае имя сертификата нужно будет задать параметром  --cert-name, узнать имена сертификатов можно командой: /root/certbot-auto certificates.

Комментариев нет:

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