Истории успеха наших клиентов — лучшие проекты
Вход/ Регистрация

Как обезопасить Nginx с Let’s Encrypt на Ubuntu

6774
10 минут чтения
Средний рейтинг статьи: 2.4

В современном мире мы проводим в интернете немало времени — общаемся, совершаем банковские операции, пользуемся сервисами оплаты ЖКХ. Если не шифровать трафик, злоумышленники могут перехватить данные пользователя или системы — от информации, которую оставляет пользователь на сайте, до паролей и доступов к личным кабинетам.

Чтобы этого избежать, был создан протокол HTTPS, который работает благодаря SSL/TLS-сертификатам. 

Защита Nginx С Помощью Let's Encrypt В Ubuntu (1)

HTTPS (HyperText Transfer Protocol Secure) — протокол передачи данных, который поддерживает шифрование при помощи криптографических протоколов SSL/TLS. По своей сути это расширенная версия обычного HTTP, на основе которого работает интернет.

С помощью этих сертификатов браузеры (или другие клиенты) подтверждают подлинность сайта: перед тем, как установить соединения пользователя с сайтом, браузер обращается в центр сертификации и проверяет цифровую подпись сайта. Только в случае, когда сертификат действителен, браузер начинает обмен данными с сайтом. 

По умолчанию все запросы HTTPS используют для подключения 443 порт. 

VDS и VPS

Гибкие виртуальные серверы с почасовым
биллингом по всему миру: Россия, Азия и Европа.

SSL и TLS — в чём разница?

В 90-х годах прошлого века компания Netscape разработала SSL-сертификат, чтобы обезопасить интернет-соединение. Но уже в 1999 году были произведены существенные доработки сертификата, потому что в его начальных версиях было немало недостатков. Такая новая версия получила название TLS — transport layer security — защита транспортного уровня. Но для того, чтобы не путать пользователей, разработчики допустили использование и старого, и нового названий. В официальной документации вы вероятнее всего встретите аббревиатуру TLS, но в этой статье мы используем более привычное SSL.

Ключ шифрования

Ещё одна очень важная роль SSL-сертификата — шифровать данные. Когда браузер понимает, что с сайтом всё в порядке, и устанавливает соединение, начинается обмен шифрами. Криптографическое шифрование бывает ассиметричным или симметричным.

Асиметричное шифрование

Каждая сторона имеет два ключа — частный и публичный. Они известны только владельцу и любому клиенту соответственно. Когда клиент отправляет сообщение, он находит публичный ключ сервера и шифрует сообщение. Сервер же расшифровывает сообщение при помощи своего частного ключа, то же самое работает и в обратную сторону. 

Image2

Симметричное шифрование

У обеих сторон есть один ключ, данные они шифруют с его помощью, при этом он годится как для шифрования, так и для расшифровки. Но перед этим между клиентом и сервером уже должно быть установлено соединение.

Image4

Установка HTTPS на веб-сервер Nginx с помощью Let’s Encrypt

Let’s Encrypt — центр сертификации, который выдаёт бесплатные SSL-сертификаты. С его помощью можно легко и быстро обезопасить сайт с помощью HTTPS-протокола. Его простота заключается в том, что практически за все шаги отвечает специальный клиент — certbot, который автоматизирует все действия с сертификатом. 

Однако несмотря на всю простоту установки и работы с сертификатами Let’s Encrypt, у них есть существенные минусы. Во-первых, его можно получить только на 90 дней, дальше придётся обновлять, тогда как платные сертификаты можно выпустить на срок до трёх лет. Во-вторых, они рассчитаны только на один домен и не проверяют компанию, которой принадлежит домен. В-третьих, — это самое важное для коммерческого проекта — Let’s Encrypt не несёт ответственность за ваши данные, вы не получаете никаких финансовых гарантий; если случится взлом бесплатных сертификатов, ущерб никто не возместит.

Но сертификаты Let’s Encrypt — отличный вариант для небольших проектов, для сайтов, которые находятся на стадии разработки или для внутренней инфраструктуры.

В этой статье мы рассмотрим, как установить бесплатный сертификат Let’s Encrypt для Nginx в Ubuntu 20.04, а также настроим его автоматическое продление. 

Требования

В этой статье нам понадобится сервер Ubuntu 20.04, который вы можете заказать на timeweb.cloud с настроенным пользователем, которому доступны привилегии sudo. На этом сервере должен быть установлен и сконфигурирован Nginx и виртуальный хост для него.

Кроме этого вы должны обладать зарегистрированным доменным именем. Вы можете купить его с помощью любого регистратора доменных имён. В нашем примере мы используем домен example.com. 

Для домена должны быть корректно настроены А-записи. В нашем случае мы установим сертификат на example.com, а также защитим www.example.com. Поэтому нужно убедиться в том, что существует две А-записи, где оба этих домена указывают на публичный адрес вашего сервера.

Установка Certbot

На официальном сайте certbot рекомендуют устанавливать через snap. Основное отличие от установки deb-пакета через менеджер apt в том, что snap устанавливает приложение сразу со всеми зависимостями, которые будут использоваться только им. Такой способ помогает избежать проблем с версиями дистрибутивов, но приложение займёт больше места на диске и будет дольше запускаться.

В нашем руководстве мы установим пакет классическим методом,так как никаких проблем с версиями зависимостей cerbot на нашем новом, «чистом» сервере нет. Если вы хотите использовать snap, воспользуйтесь официальным руководством.

В первую очередь нужно обновить индекс пакетов:

    

Далее можно устанавливать Cerbot:

    

После этих двух шагов Certbot установлен и готов к использованию. Следующий шаг — убедиться в том, что конфигурация Nginx правильная, чтобы certbot смог автоматически установить SSL-сертификат.

Конфигурация Nginx

Для автоматизации всех действий с помощью certbot вы должны соблюдать некоторые правила при написании конфигурации виртуальных хостов nginx. Во-первых, серверный блок для домена, на который вы устанавливаете SSL-сертификат, должен располагаться по адресу /etc/nginx/sites-available/example.com. Во-вторых, в этом файле должна быть настроена директива server_name, которая будет соответствовать доменам, для которых мы настраиваем безопасное соединение. 

Чтобы проверить, соблюдены ли все эти требования, откройте файл с конфигурацией:

    

Теперь найдите в нём строчку:

    

Если её нет, вы можете добавить директиву самостоятельно.

После того, как вы завершили проверку или обновление конфигурации, проверьте синтаксис nginx и перезагрузите веб-сервер:

    

Теперь certbot точно сможет найти нужную конфигурацию и автоматически её обновить.

Брандмауэр

Если на вашем сервере настроен брандмауэр ufw, нужно дополнительно разрешить трафик HTTPS. При установке Nginx в ufw регистрируется несколько профилей, поэтому вся настройка заключается в том, чтобы вместо профиля Nginx HTTP использовать профиль Nginx Full. 

    

В итоге при выполнении команды sudo ufw status вы увидите приблизительно следующую картину:

    

Получение сертификата SSL

С помощью плагина nginx certbot автоматически изменит конфигурацию нашего веб-сервера и перезагрузит её, когда это потребуется. Для установки сертификата с помощью плагина введите следующую команду:

    

Здесь флаг --nginx отвечает за использование плагина nginx, а домены, для которых устанавливается SSL указываются при помощи опции -d.

При первом запуске certbot предложит вам принять условия обслуживания и запросит адрес электронной почты. Затем он свяжется с сервером Let’s Encrypt для получения сертификата и отправит запрос, чтобы подтвердить, что вы контролируете домен. 

Когда все проверки будут пройдены, certbot спросит у вас, как настроить HTTPS:

    

Первый вариант означает, что certbot не станет настраивать автоматическое перенаправление с адреса http:// на https://. Второй — что все запросы будут перенаправлены на безопасный протокол https. В большинстве случаев следует выбирать последний вариант, однако перед этим вы должны убедиться в том, что ваш сайт корректно работает с такими запросами. Если кодовая база ещё не подготовлена, выбирайте первый вариант, перенаправление можно настроить позже.

После выбора варианта, конфигурация обновится, а nginx перезагрузится для применения новых настроек. Certbot выведет сообщение, в котором укажет места хранения сертификатов и дату их окончания.

    

Корректность настройки вы можете проверить, запросив сайт в браузере. Вы увидите значок замка, который означает безопасное соединение, и можете изучить информацию о сертификате. Кроме того, можно дополнительно протестировать сервер с помощью ssllabs.com.

Автоматическое обновление сертификата

Certbot устанавливает сертификаты, которые действительны только в течение 90 дней. Это сделано для безопасности — разработчики из Let’s Encrypt стимулируют администраторов периодически обновлять ключи. 

Однако certbot сам продлевает сертификаты, которые истекают менее, чем через 30 дней. Это происходит при помощи таймера systemd. Статус таймера вы можете узнать с помощью systemctl:

    

Image1

Однако, если вы ставили certbot через snap, имя таймера будет другим. Выполните команду ниже, чтобы просмотреть все имеющиеся таймеры:

    

В столбце UNIT найдите имя таймера для certbot.

    

Скопируйте его и просмотрите статус:

    

Чтобы протестировать, будут ли корректно обновляться сертификаты, вы можете имитировать запуск продления:

    

Если ошибок нет, значит всё настроено корректно и работает правильно. При необходимости certbot сам установит новый сертификат и перезагрузит конфигурацию nginx. Но если по каким-то причинам процесс не выполняется, nginx отправит письмо на почту, которую вы указали при первом запуске. 

Image3

Подготовили для вас выгодные тарифы на облачные серверы

Cloud MSK 15

477 ₽/мес

Процессор
1 x 3.3 ГГц
Память
1 ГБ
NVMe
15 ГБ
Канал
1 Гбит/с
Публичный IP
Cloud MSK 30

657 ₽/мес

Процессор
1 x 3.3 ГГц
Память
2 ГБ
NVMe
30 ГБ
Канал
1 Гбит/с
Публичный IP

Заключение

В этой статье мы рассмотрели основные принципы работы https и разобрались, зачем он нужен. На тестовый домен example.com и его поддомен поставили SSL-сертификат с помощью утилиты certbot — так наглядно проверили, как происходит установка Let’s Encrypt в Ubuntu.

Кроме этого, мы настроили автоматическое обновление сертификатов, чтобы веб-ресурс всегда использовал шифрование трафика.

6774
10 минут чтения
Средний рейтинг статьи: 2.4

Читайте также

Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server