Для защиты передаваемых данных между веб-сайтом и пользователем, а также для предотвращения перехвата информации или её изменения злоумышленниками, используется протокол HTTPS. Являясь более безопасной версией протокола HTTP, HTTPS сегодня – стандарт для всех современных сайтов. В особенности это касается сайтов, обрабатывающих конфиденциальные данные: пароли, платежи или личную информацию. Более того, наличие HTTPS повышает доверие к сайту у пользователей и улучшает его SEO-рейтинг.
Для получения доступа к сайту по протоколу HTTPS применяются SSL/TLS-сертификаты, которые зашифровывают данные между пользователем и сервером, тем самым защищая передаваемую информацию. Наибольшей популярностью пользуются сертификаты, предоставляемые центром сертификации Let’s Encrypt. Данные сертификаты предоставляются бесплатно и поддерживаются практически всеми современными браузерами и веб-серверами, в том числе Nginx.
Как обезопасить Nginx с Let’s Encrypt
Далее рассмотрим, как установить сертификат Let’s Encrypt на сайт, управляемый веб-сервером Nginx, который работает на виртуальном выделенном сервере с Debian 12.
В Debian 12 наиболее удобным способом установки сертификата от Let’s Encrypt представляется применение утилиты Certbot. Данная утилита является инструментом, специально разработанным для упрощённого получения Let’s Encrypt сертификатов и работы с ними. Certbot автоматизирует процесс генерации, проверки, установки и обновления сертификатов, что делает внедрение протокола HTTPS простым и быстрым.
Для начала, перед установкой нового программного обеспечения обновите информацию о доступных пакетах:
$ sudo apt update
Следующей командой запустите установку утилиты Certbot и плагина для данной утилиты. Устанавливаемый софт позволит автоматически интегрировать и настраивать сертификаты на Nginx:
$ sudo apt install certbot python3-certbot-nginx
Настройка брандмауэра
Если вы используете на своём VPS брандмауэр UFW, вам необходимо добавить в него правило, разрешающее доступ к серверу по порту 443. Данный порт используется для установки соединения по протоколу HTTPS.
Брандмауэр UFW содержит предустановленные профили для основных протоколов. Профиль, позволяющий создавать правила для доступа к веб-серверу Nginx по протоколу HTTP, называется Nginx HTTP
. В нашем примере следующей командой мы удалим разрешающее правило для данного профиля:
$ sudo ufw delete allow 'Nginx HTTP'
Затем, чтобы открыть доступ к нашему веб-сайту как по HTTP, так и по HTTPS, необходимо добавить в брандмауэр разрешающее правило для профиля, который называется Nginx Full
:
$ sudo ufw allow 'Nginx Full'
Чтобы увидеть список действующих правил брандмауэра, выполните команду:
$ sudo ufw status
Вывод команды должен содержать в том числе разрешающее правило Nginx Full
:
На данном этапе веб-сайт по-прежнему доступен по протоколу HTTP, но всё ещё не работает при подключении с использованием HTTPS. Чтобы организовать такое соединение между веб-сервером и клиентом, необходима установка TLS-сертификата.
Установка сертификата Let’s Encrypt
Чтобы установить сертификат Let’s Encrypt, запустите следующую команду, заменив vash-domain.ru
на имя вашего домена:
$ sudo certbot --nginx -d vash-domain.ru -d www.vash-domain.ru
В процессе работы утилита попросит вас указать адрес электронной почты. Он будет использоваться для рассылки уведомлений об обновлениях и сообщений о мерах безопасности. Если вы не хотите получать подобные письма, используйте латинский символ c
, после чего нажмите Enter
. Далее утилита спросит вас о готовности поделиться своим e-mail с Electronic Frontier Foundation после успешной выдачи сертификата. Эта некоммерческая организация является партнёром-основателем проекта Let’s Encrypt, и в том числе занимается разработкой Certbot. На этом процесс регистрации будет завершён и Certbot обратится к Let’s Encrypt для запроса сертификата в отношении указанных доменов. В нашем случае это – vash-domain.ru
и www.vash-domain.ru
.
Далее сервер Let’s Encrypt должен убедиться в том, что вы действительно владеете указанными доменами. После успешной проверки Certbot сгенерирует TLS-сертификат и приватный ключ. После чего утилита внесёт необходимые изменения в конфигурацию вашего сайта в Nginx и сохранит сертификат в стандартной директории Let’s Encrypt. Также Certbot автоматически настроит редирект с HTTP на HTTPS.
После внесения изменений в конфигурацию Certbot автоматически перезапустит Nginx, чтобы активировать SSL.
Let’s Encrypt сертификаты действуют 90 дней. Certbot автоматически создаёт задачу для их обновления. Чтобы проверить, работает ли задача, выполните команду:
$ sudo systemctl list-timers | grep certbot
Вывод команды должен выглядеть примерно так:
Также можно вручную протестировать процесс обновления сертификата:
$ sudo certbot renew --dry-run
На данный момент наш сайт уже доступен по протоколу HTTPS. Чтобы проверить это, откройте браузер и перейдите по адресу https://vash-domain.ru
. Естественно, замените vash-domain.ru
на доменное имя вашего сайта.
Корректировка конфигурации Nginx
Конфигурация Nginx, скорректированная утилитой Certbot при добавлении в систему TLS-сертификата, в целом абсолютно корректна. При этом можно обратить внимание на некоторые моменты в файле конфигурации, в нашем случае – /etc/nginx/sites-available/vash-domain.ru
.
Например, использование директив if
в конфигурациях Nginx считается нежелательной практикой, поскольку может приводить к неожиданным проблемам. В нашем случае можно оптимизировать эту конфигурацию, чтобы сделать её более читаемой и избежать потенциальных рисков, связанных с if
.
В файле конфигурации, скорректированном утилитой Certbot, используются две директивы if
для одного и того же действия – return 301
:
server
{
if ($host = www.vash-domain.ru) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = vash-domain.ru) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name vash-domain.ru www.vash-domain.ru;
return 404; # managed by Certbot
}
Такое количество их использований – избыточно. Если запрос на порт 80 не соответствует никакому домену, то он уже будет обработан условием. Применение явного return 404
становится не обязательным. Поэтому, чтобы избежать использования if
, можно объединить условия:
server {
listen 80;
listen [::]:80;
server_name vash-domain.ru www.vash-domain.ru;
return 301 https://$host$request_uri; # Перенаправление всех запросов на HTTPS
}
Таким образом, все запросы на домены vash-domain.ru
и www.vash-domain.ru
будут перенаправляться на HTTPS без использования if
. При этом также отпадает необходимость в применении директивы return 404
.
Следует учитывать, что если вы вносите какие-либо изменения в конфигурацию Nginx, то после этого необходимо проверить её на корректность синтаксиса:
$ sudo nginx -t
И, наконец, чтобы изменения вступили в силу, следует перезапустить службу веб-сервера:
$ sudo systemctl reload nginx