Let’s Encrypt Wildcard Certificates в Ubuntu 16.04

27 февраля 2018 произошло долгожданное событие — в Let’s Encrypt появилась возможность выпускать wildcard сертификаты. То есть можно выпустить один сертификат для домена somedomain.ru и использовать на всех поддоменах 3-го и нижестоящего уровня.

Пока в Ubuntu 16.04 у утилиты letsencrypt нет возможности их выпускать, так что выпустим их, используя certbot из ppa.

Добавляем репозиторий с certbot:
# add-apt-repository ppa:certbot/certbot

В процессе будет задан вопрос из разряда действительно ли мы хотим добавить этот репозиторий. Нажимаем Enter и визим заветный ответ: OK.

Обновляем список доступных пакетов:
# apt-get update

Устанавливаем certbot:
# apt-get install certbot

Проверяем версию:
# certbot --version

Она должна быть не меньше 0.22.

Выпускаем wildcard сертификат

Запускаем команду для выпуска сертификата и следуем её инструкции:
# certbot certonly --manual -d *.somedomain.ru --agree-tos --no-bootstrap --manual-public-ip-logging-ok --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory

Вместо *.somedomain.ru нужно установить нужный домен с указанием *. в начале, что означает действительность домена для всех поддоменов.

Программа попросит:

  1. Указать email, на который будет отправляться письма, если возникнут проблемы с перевыпуском сертификата и замечания связанные с безопасностью.
  2. Ответить на вопрос хотим ли мы разрешить отправлять нам письма от имени сообщества, поддерживающего certbot, и партнёров Let’s Encrypt.
  3. Добавить в DNS TXT запись.

Убедитесь, что запись появилась в DNS, и смело нажимайте Enter. Конечный результат должен быть вот такой:

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/somedomain.ru/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/somedomain.ru/privkey.pem
   Your cert will expire on 2018-06-29. 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"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - 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

Настройка поддомена в nginx

Если раньше не создавался ключ Diffie–Hellman, то создаём его:
# openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Создаём snippet для nginx:
# nano /etc/nginx/snippets/ssl-params.conf

Вставляем в файл:

# from https://cipherli.st/
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable preloading HSTS for now.  You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
#add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

ssl_dhparam /etc/ssl/certs/dhparam.pem;

Теперь создадим snippet для сертификата домена:
# nano /etc/nginx/snippets/ssl-somedomain.ru.conf

Вставляем в файл:

ssl_certificate /etc/letsencrypt/live/somedomain.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/somedomain.ru/privkey.pem;

Конфигурируем поддомен sub для домена somedomain.ru в nginx:
# nano /etc/nginx/sites-available/ru.somedomain.sub

Вставляем в файл:

server {
    listen               80;
    listen               [::]:80;
    server_name          sub.somedomain.ru;
    access_log           off;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    include snippets/ssl-somedomain.ru.conf;
    include snippets/ssl-params.conf;

    server_tokens off;
    keepalive_timeout 70;

    server_name sub.somedomain.ru;

    access_log  /var/log/nginx/ru.somedomain.sub-access.log;
    error_log   /var/log/nginx/ru.somedomain.sub-error.log;

    root /var/www/ru.somedomain.sub;

    location / {
        try_files $uri $uri/ /index.html =404;
    }
}

Создаём символическую ссылку:
# ln -s /etc/nginx/sites-available/ru.somedomain.sub /etc/nginx/sites-enabled/

Перезапускаем nginx:
# systemctl reload nginx

Открываем в браузере http://sub.somedomain.ru и наслаждаемся результатом.

Автоматическое обновление сертификата

Создаём скрипт для автоматического обновления сертификата:
# mkdir -p /var/www/certbot
# nano /var/www/certbot/crontab.sh

Вставляем в него:

#!/bin/bash

echo "===== {`date`} =====" >> /var/log/cb-renew.log
/usr/bin/certbot renew >> /var/log/cb-renew.log
echo "==========================================" >> /var/log/cb-renew.log

/bin/systemctl reload nginx

Делаем его исполняемым:
# chmod +x /var/www/certbot/crontab.sh

Добавляем в crontab:
# crontab -e

Добавляем строку:

30 2 * * 1 /var/www/certbot/crontab.sh

По мотивам How To Generate Let’s Encrypt Free Wildcard Certificate Using Certbot on Ubuntu 16.04.

Let’s Encrypt Wildcard Certificates в Ubuntu 16.04: 5 комментариев

  1. насколько я понимаю, в настоящее время выдача wildcard сертификатов возможна только через верификацию txt записи в dns. автоматически это умеют делать только dns регистраторов имеющих соответствующее api
    вы уверены, что в вашем варианте обновление пройдёт штатно?

    1. Андрей, я об этом не подумал. Я предположил, что TXT запись меняться не будет. Ведь, если я делаю запрос обновления, а не получения нового, то достаточно удостовериться, что я тот же самый владелец. Думаю, что в скором времени мы узнаем ответ.

  2. Получилось сделать авто-renew сертификата через Lexicon (https://github.com/AnalogJ/lexicon), который позволяет обновлять SSL с типом установки —manual.

    Нужно установить и настроить хук авторизации для DNS и хук очистки DNS. В Certbot’е указываете путь к этому файлу в параметрах:
    —manual-auth-hook «/root/certbot.default.sh auth»
    —manual-cleanup-hook «/root/certbot.default.sh cleanup»

    С DNS, которые имеют API для управления записями, это работает. Полный список поддерживаемы DNS есть в репо лексикона.
    После настройки хука, не забудьте сделать sudo crontab -e b и добавить туда задачу certbot renew —quite

Добавить комментарий

Ваш адрес email не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

Материалы распространяются под лицензией Creative Commons: Атрибуция — Некоммерческое использование — С сохранением условий (Attribution-NonCommercial-ShareAlike) 3.0 Unported.
Рейтинг@Mail.ru