Установка сертификата Let’s Encrypt Nginx в CentOS 8, AlmaLinux 9
Для владельцев сайтов рано или поздно наступает вопрос перехода сайта на https с использованием доверенных SSL-сертификатов. Можно его приобрести за деньги, можно сэкономить и получить бесплатный сертификат Let’s Encrypt, но с небольшими неудобствами в виде ограничения срока действия в 90 дней, которые решаются в данной статье.
Установка Certbot.
1. Для установки Certbot необходимо сначала установить репозиторий epel-release, командой:
dnf install epel-release -y
2. Переходим к установке клиента Certbot и плагина nginx, если в роли веб-сервера у вас Nginx:
dnf install certbot python3-certbot-nginx
3. После установки клиента certbot проверьте установленную версию программного обеспечения Let's Encrypt, выполнив следующую команду:
certbot --version
Получение сертификата Let’s Encrypt.
Процесс получения бесплатного сертификата SSL/TLS для Nginx будет выполняться вручную с помощью автономного плагина Let's Encrypt.
Для этого метода требуется, чтобы порт 80 был свободен в то время, пока клиент Let's Encrypt проверяет личность сервера и генерирует сертификаты.
Итак, если Nginx уже запущен, остановите демон с помощью следующей команды и запустите утилиту ss , чтобы убедиться, что порт 80 больше не используется в сетевом стеке.
service nginx stop systemctl stop nginx ss -tln
4. Теперь пришло время получить бесплатный сертификат SSL от Let's Encrypt , выполнив команду certbot--nginx для инициализации получения и настройки сертификата безопасности Let's Encrypt для доменов Nginx.
certbot --nginx
или
certbot --nginx -d putyato.pro -d www.putyato.pro
После ввода команды мы должны получить вывод с просьбой указать e-mail, где указываем свой почтовый ящик и нажимаем Enter:
# Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator nginx, Installer nginx Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): adminwin@mail.ru
5. После ввода e-mail нам предлагается ознакомиться и подтвердить лицензионное соглашение, нажав «Y»:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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
6. Снова видим запрос на публикацию введенного e-mail, который отклоняем клавишей «N» и видимо сообщение «Аккаунт зарегистрирован»:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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.
7. На этом шаге Certbot исследует конфигурационный файл и директорию веб-сервера и должен найти домен сайта. Если на сервере несколько доменов, то он отразит все, из которых надо будет выбрать необходимый соответствующей клавишей:
Which names would you like to activate HTTPS for? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: ithelp21.ru 2: adminwin.ru - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate numbers separated by commas and/or spaces, or leave input blank to select all options shown (Enter 'c' to cancel): 2
и получаем ответ, где говорится, что сертификат развернут и запросы на 80 порт (http) перенаправляются на 443 (https). Может открыть страницу сайта в браузере и убедиться, что адресная строка с https://.
Deploying certificate to virtualhost /etc/nginx/sites-enabled/adminwin Traffic on port 80 already redirecting to ssl in /etc/nginx/sites-enabled/adminwin - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Congratulations! Your have sucessfully enabled https://adminwin.ru - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IMPORTANT NOTES: - 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
8. Наконец, если все прошло как надо, на вашем bash-терминале отобразится поздравительное информационное сообщение. Сообщение также будет отображаться, когда срок действия сертификата истечет.
9. Для контрольной проверки введем команду, которая принудительно перевыпустит сертификат:
certbot renew --dry-run
Установите SSL-сертификат Let's Encrypt в Nginx.
10. Теперь, когда у вас есть бесплатный сертификат SSL/TLS , пришло время установить его на веб-сервер Nginx, чтобы ваш домен мог его использовать.
Все новые сертификаты SSL размещаются в /etc/letsencrypt/live/ каталоге, названном в честь вашего доменного имени. Используйте команду ls, чтобы просмотреть файлы сертификатов, выданные для вашего домена, и идентифицировать их.
ls /etc/letsencrypt/live/ ls -al /etc/letsencrypt/live/putyato.pro
11. Чтобы установить файлы сертификатов в Nginx и включить SSL, откройте /etc/nginx/nginx.conf файл для редактирования и добавьте приведенные ниже инструкции после последней строки прослушивания из блока сервера. Используйте приведенную ниже иллюстрацию в качестве руководства.
nano /etc/nginx/nginx.conf
Выдержка из блока SSL Nginx:
# SSL configuration listen 443 ssl default_server; ssl_certificate /etc/letsencrypt/live/putyato.pro/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/putyato.pro/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
Замените строку имени домена для сертификатов SSL, чтобы она соответствовала вашему собственному домену.
12. Наконец, перезапустите службу Nginx и посетите свой домен по протоколу HTTPS по адресу https://yourdomain. Страница должна загружаться плавно, без ошибок сертификата.
systemctl restart nginx service nginx restart
13. Чтобы проверить сертификат SSL/TLS и его целостность, перейдите по следующей ссылке:
https://www.ssllabs.com/ssltest/analyze.html
14. Если вы получите уведомление о том, что ваш сервер поддерживает слабый обмен ключами DH и имеет общий рейтинг B , сгенерируйте новый шифр Diffie-Hellman в каталоге /etc/nginx/ssl/ , чтобы защитить ваш сервер от атаки Logjam с помощью выполнив следующие команды.
mkdir /etc/nginx/ssl cd /etc/nginx/ssl openssl dhparam -out dhparams.pem 4096
В этом примере мы использовали 4096- битный ключ, генерация которого на самом деле занимает много времени и приводит к дополнительным нагрузкам на ваш сервер и на SSL-квитирование.
Если нет явной необходимости использовать ключ такой длины и вы не впали в паранойю, вам следует быть в безопасности с ключом длиной 2048 бит.
15. После того, как ключ DH был сгенерирован, откройте файл конфигурации Nginx и добавьте приведенные ниже инструкции после ssl_ciphersстроки, чтобы добавить ключ DH и повысить уровень безопасности вашего домена до определенного A+ уровня.
nano /etc/nginx/nginx.conf
Добавьте следующий фрагмент блока в Nginx.conf:
ssl_dhparam /etc/nginx/ssl/dhparams.pem; ssl_session_timeout 30m; ssl_session_cache shared:SSL:10m; ssl_buffer_size 8k; add_header Strict-Transport-Security max-age=31536000;
16. Перезапустите службу Nginx , чтобы применить изменения, и повторно протестируйте сертификат SSL, очистив предыдущий кеш результатов по ссылке, упомянутой выше.
systemctl restart nginx service nginx restart
Автоматическое обновление сертификатов Certbot
17. Let's Encrypt CA выпускает бесплатные сертификаты SSL/TLS , действительные в течение 90 дней. Сертификаты можно обновить вручную и применить до истечения срока их действия с помощью плагина webroot, не останавливая веб-сервер, введя следующие команды:
certbot --nginx -d putyato.pro -d www.putyato.pro systemctl reload nginx
При выполнении приведенной выше команды обязательно замените ее putyato.pro на соответствие вашему домену.
18. Чтобы автоматически продлить сертификат до истечения срока его действия, создайте задание cron для существующего файла crontab.
certbot renew --dry-run
echo "0 0,12 * * * root certbot renew --quiet" | sudo tee -a /etc/crontab > /dev/null
crontab -e
Добавьте следующее задание cron в нижней части файла, которое будет запускаться каждый день в полдень, чтобы проверить истечение срока действия сертификата и обновить его. Этот --quiet параметр сообщает certbot не генерировать выходные данные.
Ваш текстовый редактор откроет crontab по умолчанию, который на данный момент представляет собой пустой текстовый файл. Войдите в режим вставки, нажав i и добавьте следующую строку:
0 0,12 * * * python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew --quiet
Когда вы закончите, нажмите ESC, чтобы выйти из режима вставки, затем :wq и ENTER для сохранения и выхода из файла.
Вот и все! Теперь сервер Nginx может доставлять безопасный веб-контент с помощью бесплатного сертификата SSL/TLS Let’s Encrypt на вашем веб-сайте.