ИТ Блог. Администрирование серверов на основе Linux (Ubuntu, Debian, CentOS, openSUSE)

Безопасный Nginx с помощью Let’s Encrypt на Debian 10 Linux

Безопасный Nginx с помощью Let's Encrypt на Debian 10 Linux

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.

 

Убедитесь, что выполнены следующие предварительные условия, прежде чем приступить к работе с руководством:

 

Мы будем использовать инструмент certbot для получения и продления сертификатов.

Certbot – это полнофункциональный и простой в использовании инструмент, который автоматизирует задачи по получению и обновлению SSL-сертификатов Let’s Encrypt и настройке веб-серверов для использования сертификатов.

Пакет certbot входит в стандартные репозитории Debian. Выполните следующие команды для установки certbot:

sudo apt update
sudo apt install certbot

 

Обмен ключами Диффи-Хеллмана (DH) – это метод безопасного обмена криптографическими ключами по незащищенному каналу связи.

Мы собираемся сгенерировать новый набор 2048-битных параметров DH для усиления безопасности:

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

 

Вы также можете изменить размер до 4096 бит, но генерация может занять более 30 минут в зависимости от энтропии системы.

 

Чтобы получить сертификат 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+оценку, как показано на рисунке ниже:

Безопасный Nginx с помощью Let's Encrypt на Debian 10 Linux

 

Сертификаты 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 для использования сертификатов.

Exit mobile version