Содержание
На нашем CentOS 7 с веб-сервером nginx и haproxy перед ним, получим бесплатный сертификат для одного сайта.
Настройка и получение первого сертификата
Для получения сертификата и последующего обновления будем использовать программку cetbot с плагином webroot.
Этот способ не предполагает остановки веб-сервера для получения сертификата или вмешательства в DNS.
Документация здесь:
https://certbot.eff.org/docs/using.html#webroot
yum install certbot
yum install -y python2-cloudflare python2-certbot-dns-cloudflare
certbot plugins
Плагин webroot работает, создавая временный файл для каждого запрашиваемого домена в директории ${webroot-path}/.well-known/acme-challenge.
Это нужно, чтобы в процессе запроса и выдачи сертификата на домен, сервер Let’s Encrypt смог сделать HTTP-запрос про имени домена в сертификате и проверить, что эти домены действительно расположены на сервере, который запрашивает сертификат.
Саму директорию вручную создавать не нужно, этим займётся certbot, он же удалит эту директорию по завершении получения сертификата. Нам только нужно будет в строке запроса указать корневую директорию сайта с запрашиваемым доменом.
В нашем случае запросим сертификат будет для домена blog.andruxo.ru, а корневая директория сайта у нас /www/homeblog/html.
Добавляем в конфиг nginx строки:
location /.well-known/acme-challenge/ {
try_files $uri $uri;
}
Теперь мы готовы запросить сертификат для нашего домена:
[root@web html]# certbot certonly --webroot -w /www/homeblog/html -d blog.andruxo.ru
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Enter email address (used for urgent renewal and security notices)
(Enter 'c' to cancel): dron_s@inbox.ru
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: y
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: n
Account registered.
Requesting a certificate for blog.andruxo.ru
Performing the following challenges:
http-01 challenge for blog.andruxo.ru
Using the webroot path /www/homeblog/html for all unmatched domains.
Waiting for verification...
Cleaning up challenges
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/blog.andruxo.ru/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/blog.andruxo.ru/privkey.pem
Your certificate will expire on 2021-06-18. 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"
- 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
Итак, всё прошло успешно и сертификат сохранён на диск:
– наш сертификат и цепочка сертификатов издающих ЦС сохранилась в /etc/letsencrypt/live/blog.andruxo.ru/fullchain.pem
– закрытый ключ сертификата сохранился в /etc/letsencrypt/live/blog.andruxo.ru/privkey.pem
Теперь наша задача этот сертификат применить куда нужно.
Установка сертификата в nginx
Здесь я не буду полностью описывать настройку ssl в nginx, это отдельная большая тема, только коснусь непосредственно сертификатов Let’s Encrypt.
Т.к. после получения и обновления сертификата мы каждый раз получаем pem-ы в фиксированной директории самого letsencrypt, то имеет смысл просто указать nginx, где он может взять последнюю версию сертификата и закрытого ключа, а не копировать их каждый раз в свою директорию. Эти строки помещаем в конфиг nginx для нашего сайта:
ssl_certificate /etc/letsencrypt/live/blog.andruxo.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/blog.andruxo.ru/privkey.pem;
На этом всё, главное не забывать перезапускать nginx после обновления сертификата.
Установка сертификата в haproxy
Так как haproxy не поддерживает раздельные сертификат и ключ, то ему требуется слить их в один файл и положить в удобную директорию:
Создаем папку для haproxy, куда положим сертификат
mkdir /etc/haproxy/cert
Создадим комбинированный pem-файл в нужной директории:
cat /etc/letsencrypt/live/blog.andruxo.ru/fullchain.pem /etc/letsencrypt/live/blog.andruxo.ru/privkey.pem > /etc/haproxy/cert/blog.andruxo.ru.withKey.pem
В конфиге haproxy в разделе frontend нужно прописать примерно следующее:
bind *:443 ssl crt /etc/haproxy/cert/blog.andruxo.ru.withKey.pem alpn h2,http/1.1
Автоматическое обновление сертификата
Сертификаты Let’s Encrypt действительны всего 90 дней, поэтому важно автоматизировать автоматический перевыпуск.
Мы добавим в cron задачу запроса-получения сертификата, а также действий, которые необходимо выполнить после получения сертификата. В нашем случае необходимо сделать комбинированный pem-файл для haproxy и выполнить перезапуск самого haproxy и nginx.
Создадим скрипт для действий после обновления. Я положу этот скрипт в папку самого letsencrypt, для чего создам там папку:
mkdir /etc/letsencrypt/_my_renewal_scripts
cd /etc/letsencrypt/_my_renewal_scripts
vi after_renew_actions_blog_andruxo_ru.sh
вставим следующее содержимое в файл:
#!/bin/sh
#-- cat files to make combined .pem for haproxy
cat /etc/letsencrypt/live/blog.andruxo.ru/fullchain.pem /etc/letsencrypt/live/blog.andruxo.ru/privkey.pem > /etc/haproxy/cert/blog.andruxo.ru.withKey.pem
#-- secure cert with private key
chmod -R go-rwx /etc/haproxy/cert
#-- reload haproxy
systemctl reload haproxy
#-- reload nginx
nginx -s reload
Скрипт нужно сделать исполняемым:
chmod u+x after_renew_actions_blog_andruxo_ru.sh
Запустим скрипт, он должен отработать без ошибок:
./after_renew_actions_blog_andruxo_ru.sh
Теперь можно добавить в cron саму задачу автоообновления.
Скрипт у нас будет запускаться каждую неделю по субботам в 21:00 и проверять, нужно ли обновить сертификат. Если время ещё не подошло, то certbot запрашивать обновление не будет.
Под пользователем root открываем его список задач cron:
crontab -e
вставляем строчку
0 0 21 * * SAT certbot renew --cert-name blog.andruxo.ru --post-hook /etc/letsencrypt/_my_renewal_scripts/after_renew_actions_blog_andruxo_ru.sh >> /etc/letsencrypt/my_hooks/postrenew_blog_andruxo_ru.log
и сохраняем.
Для немедленной проверки работы задачи можно запустить задачу из cron-a, добавив параметр --force-renewal для принудительного обновления:
certbot renew --force-renewal --cert-name blog.andruxo.ru --post-hook /etc/letsencrypt/_my_renewal_scripts/after_renew_actions_blog_andruxo_ru.sh >> /etc/letsencrypt/_my_renewal_scripts/after_renew_actions_blog_andruxo_ru.log
Подробные логи самого certbot можно тут: /var/log/letsencrypt/letsencrypt.log
Wildcard
mkdir /root/.secrets
ls -al
chmod 0700 /root/.secrets/
vi /root/.secrets/cloudflare.ini
вставить:
dns_cloudflare_email = your_cloudflare_login
dns_cloudflare_api_key = your_cloudflare_api_key
certbot certonly --cert-name andruxo.ru --agree-tos --dns-cloudflare --dns-cloudflare-credentials /root/.secrets/cloudflare.ini --dns-cloudflare-propagation-seconds 30 --server https://acme-v02.api.letsencrypt.org/directory -d "*.andruxo.ru" -d andruxo.ru