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 нужно установить нужный домен с указанием *. в начале, что означает действительность домена для всех поддоменов.
Программа попросит:
- Указать email, на который будет отправляться письма, если возникнут проблемы с перевыпуском сертификата и замечания связанные с безопасностью.
- Ответить на вопрос хотим ли мы разрешить отправлять нам письма от имени сообщества, поддерживающего certbot, и партнёров Let’s Encrypt.
- Добавить в 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.
насколько я понимаю, в настоящее время выдача wildcard сертификатов возможна только через верификацию txt записи в dns. автоматически это умеют делать только dns регистраторов имеющих соответствующее api
вы уверены, что в вашем варианте обновление пройдёт штатно?
Андрей, я об этом не подумал. Я предположил, что TXT запись меняться не будет. Ведь, если я делаю запрос обновления, а не получения нового, то достаточно удостовериться, что я тот же самый владелец. Думаю, что в скором времени мы узнаем ответ.
https://habrahabr.ru/post/351252/
в комментах есть ответ.
и где-то в официальных гитхабах видел список регистраторов, имеющих соответствующий api
Получилось сделать авто-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
Рамиль, спасибо!