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

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

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