Настройка сертификатов SSL
Что такое Certbot?
Это клиент протокола ACME предназначенный для автоматического управления SSL-сертификатами от Let's Encrypt, он позволяет полностью автоматизировать процесс получения и продления сертификата, а при использовании соответствующих плагинов даже может автоматически конфигурировать веб-сервер или иное, использующее сертификат приложение.
Все дальнейшие инструкции будут предназначены для пользователей актуальных версий Debian и Ubuntu, но многое будет справедливо и для иных дистрибутивов Linux.
Установка в Ubuntu 14.04/16.04
В отличие от разработчиков Debian в Ubuntu пошли другим путем, оформив Certbot в виде отдельного PPA. Данная технология позволяет любому желающему создать собственный репозиторий и хорошо известна любому пользователю Ubuntu, однако вся ответственность за содержимое PPA лежит только на их авторах, поэтому использовать их следует с определенной долей осмотрительности и осторожности.
Прежде всего установим необходимое для работы с PPA программное обеспечение:
apt-get install software-properties-common
Затем добавим нужный PPA:
add-apt-repository ppa:certbot/certbot
Обновим список пакетов:
apt-get update
и установим Certbot:
apt-get install certbot
Последовательность действий для всех дистрибутивов Ubuntu одинаковая, при подключении PPA автоматически определяется выпуск Ubuntu и добавляются нужные репозитории. Точно также можно установить Certbot на промежуточные релизы (16.10 или 17.04) но мы не рекомендуем их использование в производственных средах.
Подготовка к получению сертификатов
В предыдущей статье цикла мы довольно подробно разбирали работу плагина webroot, который позволяет автоматически получать сертификаты используя уже установленный в системе веб-сервер. Если коротко, то вы указываете путь к корневой директории сайта, для которого получаете сертификат в файловой системе, Certbot создает там необходимую структуру папок и размещает необходимый для проверки файл.
В случае с одним доменом это не вызывает проблем, но если их много или вам требуется сертификат сразу на несколько доменов (основной домен и поддомены), корневые директории у которых отличаются, то у вас возникнут затруднения. Поэтому сам Let's Encrypt рекомендует перейти в таком случае на единую точку подтверждения сертификатов. Сделать это несложно, и мы сейчас расскажем, как.
В доступной для веб-сервера директории создадим отдельную папку, скажем, letsencrypt, которую затем мы будем использовать для всех обслуживаемых доменов и установим ее владельцем веб-сервер:
mkdir /var/www/letsencrypt
chown www-data:www-data /var/www/letsencrypt
Теперь нам нужно сделать так, чтобы любой запрос вида:
http://example.com/.well-known/acme-challenge
приводил к физическому размещению:
/var/www/letsencrypt/.well-known/acme-challenge
Это несложно, но для каждого из веб-серверов делается по-разному, ниже мы рассмотрим самые популярные из них.
Nginx
Nginx - второй по популярности веб-сервер (и первый среди продвинутых пользователей) предполагает несколько иной подход к настройке. Для каждого виртуального хоста в секцию server следует добавить блок:
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /var/www/letsencrypt;
}
location = /.well-known/acme-challenge/ {
return 404;
}
Регистрация в Let's Encrypt
Да, вы не ошиблись, именно регистрация. Обычно этот пункт пропускают, так как регистрация автоматически выполняется при первом получении сертификата. Но так как мы подробно разбираем работу Certbot, то решили коротко коснуться и этого момента.
Регистрация нужна для формирования ключевой пары, которой впоследствии подписываются все запросы, что позволяет удостовериться в подлинности отправителя. Это важно, так как все запросы передаются по открытым каналам и теоретически возможен их перехват и модификация.
Адрес электронной почты указываемый при регистрации используется для рассылки уведомлений, например, при неудачной попытке продления сертификата, поэтому следует указывать рабочий ящик, лучше всего собственный. Один и тот-же адрес можно использовать для регистрации на разных хостах, ограничений по этому параметру нет.
Для регистрации выполните команду
certbot register -m admin@example.com
--dry-run
включает тестовый режим, при котором производится симуляция получения сертификата, --webroot - указывает используемый плагин, после ключа -w указываем путь к директории для letsencrypt, а затем через ключ -d
указываем домены для которых мы получаем сертификат. Как минимум это должно быть основное имя сайта и имя c www, хотя никто не мешает включить вам в сертификат все нужные поддомены или вообще разные домены. Лимит на количество доменов в сертификате равен 100.
certbot certonly --dry-run --webroot -w /var/www/letsencrypt -d pravosleva.pro -d www.pravosleva.pro
После того как тестовый запуск увенчался успехом можно переходить к получению сертификата:
certbot certonly --webroot -w /var/www/letsencrypt -d pravosleva.pro -d www.pravosleva.pro
See original (opens in a new tab)
See also about Failed Validation Limit
too many failed authorizations recently: see https://letsencrypt.org/docs/failed-validation-limit
root@pravosleva:/var/www# certbot certonly --webroot -w /var/www/letsencrypt -d pravosleva.pro -d www.pravosleva.pro^C
root@pravosleva:/var/www# certbot certonly --dry-run --webroot -w /var/www/letsencrypt -d pravosleva.pro -d www.pravosleva.pro
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for pravosleva.pro
http-01 challenge for www.pravosleva.pro
Using the webroot path /var/www/letsencrypt for all unmatched domains.
Waiting for verification...
Cleaning up challenges
IMPORTANT NOTES:
- The dry run was successful.
root@pravosleva:/var/www# certbot certonly --webroot -w /var/www/letsencrypt -d pravosleva.pro -d www.pravosleva.pro
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator webroot, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for pravosleva.pro
http-01 challenge for www.pravosleva.pro
Using the webroot path /var/www/letsencrypt for all unmatched domains.
Waiting for verification...
Cleaning up challenges
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/pravosleva.pro/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/pravosleva.pro/privkey.pem
Your cert will expire on 2023-12-28. 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
После этого раскоментируем следующие строки:
server {
listen 80;
listen 443 ssl;
server_name .pravosleva.pro;
ssl_certificate /etc/letsencrypt/live/pravosleva.pro/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/pravosleva.pro/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
ssl_prefer_server_ciphers on;
ssl_ciphers 'kEECDH+ECDSA+AES128 kEECDH+ECDSA+AES256 kEECDH+AES128 kEECDH+AES256 kEDH+AES128 kEDH+AES256 DES-CBC3-SHA +SHA !aNULL !eNULL !LOW !MD5 !EXP !DSS !PSK !SRP !kECDH !CAMELLIA !RC4 !SEED';
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /var/www/letsencrypt;
}
location = /.well-known/acme-challenge/ {
return 404;
}
location /static {
root /root/projects/pravosleva-blog-2021-frontend.nextjs/public;
}
location /socket.io {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header Test "hello world from nginx";
proxy_pass http://nextjs;
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://nextjs;
}
}