Let’s Encrypt – это бесплатный, автоматизированный и открытый центр сертификации, разработанный исследовательской группой Internet Security Research Group (ISRG), который предоставляет бесплатные сертификаты SSL.
Сертификаты, выпущенные Let’s Encrypt, являются доверенными для всех основных браузеров и действительны в течение 90 дней с даты выпуска.
Из этой статьи Вы узнаете, как установить бесплатный SSL-сертификат Let’s Encrypt на Debian 10 Buster с Nginx в качестве веб-сервера. Мы также покажем, как настроить Nginx для использования SSL-сертификата и включения HTTP/2.
Предпосылки
Убедитесь, что выполнены следующие предварительные условия, прежде чем приступить к работе с руководством:
- Войдите в систему как пользователь root или пользователь с привилегиями sudo.
- Домен, для которого вы хотите получить сертификат SSL, должен указывать на IP вашего публичного сервера. Мы будем использовать example.ru.
- Установленный Nginx.
Установка Certbot
Мы будем использовать инструмент certbot для получения и продления сертификатов.
Certbot – это полнофункциональный и простой в использовании инструмент, который автоматизирует задачи по получению и обновлению SSL-сертификатов Let’s Encrypt и настройке веб-серверов для использования сертификатов.
Пакет certbot входит в стандартные репозитории Debian. Выполните следующие команды для установки certbot:
sudo apt update sudo apt install certbot
Генерация группы DH (Диффи-Хеллман)
Обмен ключами Диффи-Хеллмана (DH) – это метод безопасного обмена криптографическими ключами по незащищенному каналу связи.
Мы собираемся сгенерировать новый набор 2048-битных параметров DH для усиления безопасности:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Вы также можете изменить размер до 4096 бит, но генерация может занять более 30 минут в зависимости от энтропии системы.
Получение SSL-сертификата Let’s Encrypt
Чтобы получить сертификат SSL для домена, мы собираемся использовать плагин Webroot. Он работает путем создания временного файла для проверки запрашиваемого домена в каталоге ${webroot-path}/.well-known/acme-challenge. Сервер Let’s Encrypt отправляет HTTP-запросы во временный файл для проверки того, что запрашиваемый домен разрешается на сервере, на котором работает certbot.
Мы собираемся отобразить все HTTP-запросы .well-known/acme-challenge для одного каталога /var/lib/letsencrypt.
Выполните следующие команды, чтобы создать каталог и сделать его доступным для записи для сервера Nginx:
mkdir -p /var/lib/letsencrypt/.well-known chgrp www-data /var/lib/letsencrypt chmod g+s /var/lib/letsencrypt
Чтобы избежать дублирования кода, мы создадим два фрагмента, которые будут включены во все файлы блоков сервера Nginx.
Откройте ваш текстовый редактор и создайте первый фрагмент letsencrypt.conf:
sudo nano /etc/nginx/snippets/letsencrypt.conf
/etc/nginx/snippets/letsencrypt.conf
location ^~ /.well-known/acme-challenge/ { allow all; root /var/lib/letsencrypt/; default_type "text/plain"; try_files $uri =404; }
Второй фрагмент ssl.conf включает в себя разделители, рекомендованные Mozilla, включает OCSP Stapling, HTTP Strict Transport Security (HSTS) и применяет несколько ориентированных на безопасность заголовков HTTP.
sudo nano /etc/nginx/snippets/ssl.conf
/etc/nginx/snippets/ssl.conf
ssl_dhparam /etc/ssl/certs/dhparam.pem; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 30s; add_header Strict-Transport-Security "max-age=63072000" always; add_header X-Frame-Options SAMEORIGIN; add_header X-Content-Type-Options nosniff;
После этого откройте блок сервера домена и letsencrypt.conf включите фрагмент, как показано ниже:
sudo nano /etc/nginx/sites-available/example.ru
/etc/nginx/sites-available/example.ru
server { listen 80; server_name example.ru www.example.ru; include snippets/letsencrypt.conf; }
Создайте символическую ссылку на каталог sites-enabled, чтобы включить блок сервера домена:
sudo ln -s /etc/nginx/sites-available/example.ru /etc/nginx/sites-enabled/
Перезапустите службу Nginx, чтобы изменения вступили в силу:
sudo systemctl restart nginx
Теперь вы готовы получить файлы сертификатов SSL, выполнив следующую команду:
sudo certbot certonly --agree-tos --email admin@example.ru --webroot -w /var/lib/letsencrypt/ -d example.ru -d www.example.ru
Если сертификат SSL успешно получен, на вашем терминале будет напечатано следующее сообщение:
IMPORTANT NOTES: IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/example.ru/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/example.ru/privkey.pem Your cert will expire on 2020-02-22. 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
Отредактируйте блок сервера домена и включите файлы сертификатов SSL следующим образом:
sudo nano /etc/nginx/sites-available/example.ru
/etc/nginx/sites-available/example.ru
server { listen 80; server_name www.example.ru example.ru; include snippets/letsencrypt.conf; return 301 https://$host$request_uri; } server { listen 443 ssl http2; server_name www.example.ru; ssl_certificate /etc/letsencrypt/live/example.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.ru/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/example.ru/chain.pem; include snippets/ssl.conf; include snippets/letsencrypt.conf; return 301 https://example.ru$request_uri; } server { listen 443 ssl http2; server_name example.ru; ssl_certificate /etc/letsencrypt/live/example.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.ru/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/example.ru/chain.pem; include snippets/ssl.conf; include snippets/letsencrypt.conf; # . . . other code }
Приведенная выше конфигурация говорит Nginx о перенаправлении с HTTP на HTTPS и с www на версию без www.
Перезапустите или перезагрузите службу Nginx, чтобы изменения вступили в силу:
sudo systemctl restart nginx
Откройте свой веб-сайт с помощью https://, и вы увидите зеленый значок замка.
Если вы протестируете свой домен с помощью SSL Labs Server Test , вы получите A+оценку, как показано на рисунке ниже:
Автообновление Let’s Encrypt SSL сертификата
Сертификаты Let’s Encrypt действительны в течение 90 дней. Для автоматического продления сертификатов до истечения срока их действия пакет certbot создает cronjob, который запускается два раза в день и автоматически обновляет любой сертификат за 30 дней до истечения срока его действия.
При обновлении служба nginx должна быть перезагружена, чтобы сервер мог загрузить сертификат. Добавьте –renew-hook “systemctl reload nginx” в файл /etc/cron.d/certbot, чтобы он выглядел так:
sudo nano /etc/cron.d/certbot
/etc/cron.d/certbot
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew --renew-hook "systemctl reload nginx"
Протестируйте процесс автоматического обновления, выполнив эту команду:
sudo certbot renew --dry-run
Если ошибок нет, значит, процесс обновления прошел успешно.
Вывод
Наличие SSL-сертификата является обязательным в настоящее время. Он защищает ваш веб-сайт, повышает рейтинг SERP и позволяет вам включить HTTP/2 на вашем веб-сервере.
В этой статье мы показали, как создавать и обновлять сертификаты SSL с помощью сценария certbot. Мы также показали, как настроить Nginx для использования сертификатов.