Как настроить SSL в Nginx и проверить ошибки HTTPS?

Начните с проверки конфигурации командой sudo nginx -t. Чтобы настроить HTTPS в Nginx на VPS, нужны сертификат домена, полная цепочка промежуточных сертификатов и соответствующий закрытый ключ. Затем укажите пути к файлам в конфигурации сайта, проверьте её и перечитайте настройки без остановки сервера. Ниже разберём, как подготовить файлы, избежать ошибки с цепочкой доверия и проверить результат. Инструкция подходит для сайта компании или интернет-магазина, если у вас уже есть доступ к VPS и установлен Nginx.
Что проверить перед настройкой SSL в Nginx?
Сначала убедитесь, что домен открывает нужный сайт, а вы редактируете его конфигурацию. На одном VPS могут работать несколько сайтов, поэтому изменение первого попавшегося блока server легко затронет соседний проект. Найдите блок с директивой server_name и сопоставьте имя с доменом, который вводит посетитель.
HTTPS шифрует обмен между браузером и сайтом. Сертификат помогает браузеру проверить, что соединение установлено с нужным доменом. При этом HTTPS не заменяет обновления сайта, резервные копии и защиту административной панели (источник: Cropas, «HTTPS и SSL-сертификат»).
- Проверьте исходное состояние: выполните sudo nginx -t и сохраните текст ошибки, если проверка завершилась неуспешно.
- Найдите конфигурацию нужного домена. В зависимости от системы она может находиться в /etc/nginx/conf.d/ или /etc/nginx/sites-enabled/.
- Сделайте копию файла, который будете менять, вне каталогов, откуда Nginx загружает конфигурацию.
- Подготовьте сертификат с цепочкой и закрытый ключ. Уточните срок действия и имена доменов в сертификате.
Если сертификат ещё не выпущен, сначала пройдите настройку бесплатного SSL на VPS. Здесь дальше предполагается, что файлы уже получены. Для сайта с адресами с www и без www проверьте покрытие каждого имени: перенаправление между ними само по себе не устраняет ошибку сертификата.
Как собрать полную цепочку сертификатов?
В директиве ssl_certificate Nginx ожидает файл, где первым идёт сертификат сайта, а следом промежуточные сертификаты центра сертификации. Такой файл часто называют fullchain.pem. Название произвольное, значение имеет содержимое и порядок блоков.
Если сервис выпуска уже подготовил fullchain.pem, используйте этот файл. Если вам выдали сертификат сайта и промежуточные сертификаты отдельно, объедините их в указанном порядке по инструкции центра сертификации. Корневой сертификат обычно не требуется отправлять клиенту: браузер берёт доверенные корни из своего хранилища.
- Сертификат сайта содержит открытый ключ и имена доменов. Посмотреть его можно командой openssl x509 -in /путь/к/сертификату.pem -noout -subject -issuer -dates.
- Промежуточные сертификаты связывают сертификат сайта с доверенным корнем. Один сертификат домена вместо полной цепочки иногда оставляет часть клиентов с ошибкой доверия.
- Закрытый ключ храните отдельно от публичных файлов сайта. Не отправляйте его в переписку с поддержкой и не вставляйте в открытые отчёты.
Путь в команде выше замените на настоящий. Она показывает сведения о первом сертификате в файле, поэтому успешный вывод ещё не подтверждает полноту цепочки. Окончательную проверку нужно выполнить через сетевое соединение после применения настроек.
Если Nginx сообщает о несоответствии ключа сертификату, найдите исходную пару файлов. Простое переименование ключа проблему не исправит. При утрате ключа потребуется перевыпуск сертификата с новым ключом.
Как указать сертификат и ключ в конфигурации Nginx?
Добавьте настройки в существующий блок server нужного сайта. Не заменяйте весь файл коротким примером: вместе со старой конфигурацией можно потерять обработку приложения, ограничения доступа и правила для файлов. Ниже example.com обозначает ваш домен, а пути нужно заменить на фактические.
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/example.com/privkey.pem;
Эти директивы задают приём HTTPS-соединений и файлы сертификата. Если строка listen для HTTPS уже есть, проверьте её вместо добавления дубликата. Для IPv6 настройку прослушивания проверяют отдельно, если домен имеет соответствующую DNS-запись.
Закрытый ключ должен быть доступен процессу, который читает конфигурацию Nginx, но не всем пользователям сервера. Не расширяйте права доступа без разбора ради устранения ошибки permission denied. Сначала проверьте владельца файла, права на родительские каталоги и модель запуска сервиса.
- Сохраните изменения в конфигурации сайта.
- Запустите sudo nginx -t. Если проверка не прошла, исправьте ошибку по указанному пути и строке.
- После успешной проверки выполните sudo systemctl reload nginx, если сервер использует systemd.
- Проверьте состояние сервиса командой sudo systemctl status nginx и откройте сайт в браузере.
На сервере без systemd используйте принятый в вашей системе способ перечитать конфигурацию. Перезапуск всего VPS для замены сертификата не требуется. Если проверка конфигурации завершилась ошибкой, не переходите к применению изменений.
Как проверить HTTPS и найти причину ошибки?
Откройте сайт в браузере и проверьте сведения о сертификате: имя домена, срок действия и отсутствие предупреждений. Затем отправьте тестовую заявку через форму. Загрузка главной страницы ещё не подтверждает, что после перехода работают отправка формы и переходы между страницами.
Для проверки соединения из терминала выполните команду: openssl s_client -connect example.com:443 -servername example.com -verify_hostname example.com -verify_return_error < /dev/null. Замените example.com на свой домен в каждом месте. Параметр -servername передаёт имя сайта, чтобы сервер выбрал нужный сертификат при размещении нескольких доменов на одном IP-адресе.
В выводе ищите ошибки проверки и сведения о сертификате. Успешная проверка означает, что на этой машине удалось проверить цепочку и имя с учётом её хранилища доверия. Для просмотра сертификатов, которые сервер отправляет клиенту, добавьте к команде параметр -showcerts.
- Ошибка имени домена: проверьте server_name и список имён в сертификате. Для другого домена нужен сертификат, который его покрывает.
- Ошибка доверия: проверьте состав fullchain.pem и порядок сертификатов. Убедитесь, что сервер отправляет промежуточные сертификаты.
- Истёкший сертификат: проверьте, какой файл использует Nginx и перечитал ли он настройки после обновления.
- Отказ в соединении: проверьте состояние Nginx, прослушивание HTTPS-порта и правила межсетевого экрана.
- Страница открывается с предупреждениями о ресурсах: найдите в инструментах разработчика запросы картинок или скриптов по HTTP и исправьте их адреса.
Если перед VPS работает прокси, он может завершать HTTPS-соединение и показывать посетителю собственный сертификат. Тогда отдельно проверяют публичную точку входа и соединение до VPS. Обновление файлов только на сервере приложения не изменит сертификат, который отдаёт прокси.
Типичные ошибки при настройке SSL
- Меняют сертификат, но оставляют старый ключ. Исправление: используйте пару файлов от одного выпуска и повторите проверку конфигурации.
- Загружают только сертификат домена. Исправление: укажите полную цепочку в ssl_certificate и проверьте её через сетевое соединение.
- Хранят ключ в каталоге сайта. Исправление: перенесите его за пределы публичного каталога и ограничьте доступ.
- Включают принудительный переход на HTTPS до проверки защищённой версии. Исправление: сначала проверьте страницы и формы, затем настраивайте перенаправление с HTTP.
- Считают выпуск сертификата завершённой задачей. Исправление: настройте обновление и применение нового сертификата в Nginx.
После первого успешного запуска проверьте автоматическое обновление SSL-сертификатов на VPS. Новый файл на диске и новый сертификат в браузере не всегда появляются одновременно: после обновления Nginx должен перечитать конфигурацию. Проверять результат нужно со стороны клиента.
Если сервер сопровождает подрядчик, включите в задачу конкретный результат: HTTPS работает на нужных доменах, цепочка проходит проверку, формы отправляются, обновление сертификата настроено. По такому списку проще принять работу по защите серверной инфраструктуры, чем по сообщению «SSL установлен».
Сейчас выполните sudo nginx -t: это первый шаг меньше чем на две минуты, который покажет, можно ли переходить к изменениям или сначала нужно исправить текущую конфигурацию.


