Для установки сертификата в NGINX нам потребуется два файла, а именно сам сертификат(обычно расширение .crt) и приватный ключ(обычно расширение .key). Иногда ЦС(центр сертификации) может присылать несколько файлов, где часть будет представлять цепочку сертификатов и один файл Ваш приватный ключ.
Если цепочка сертификатов представлена отдельными файлами, то следует объединить их в один по шаблону:
Нужны действующий SSL-сертификат для вашего домена, его приватный ключ, промежуточные сертификаты и доступ к серверу с правами администратора.
Сохраните копию текущего конфига. Если конфигурацией управляет панель хостинга, подключайте SSL через неё: ручные правки могут быть перезаписаны.
Во всех примерах замените example.com своим доменом. Пути к файлам — пример для Linux; используйте пути вашей установки.
01Подготовьте сертификат
Создайте файл цепочки: сначала сертификат вашего домена, затем промежуточные сертификаты в порядке, указанном центром сертификации. Если вам уже выдали готовый fullchain, используйте его.
cat example.com.crt intermediate.crt > fullchain.pem
Приватный ключ остаётся отдельным файлом. Не публикуйте его и не передавайте вместе с сертификатом.
02Разместите файлы
Скопируйте цепочку и ключ в отдельный каталог. Ниже — пример для обычной установки, где главный процесс NGINX запускается от root.
sudo install -d -m 755 /etc/nginx/ssl
sudo install -m 644 fullchain.pem /etc/nginx/ssl/example.com.fullchain.pem
sudo install -m 600 example.com.key /etc/nginx/ssl/example.com.key
Ключ должен быть доступен главному процессу NGINX. Если он работает от другого пользователя или в контейнере, настройте владельца и путь для этого окружения.
03Настройте HTTPS
В существующий блок server вашего сайта добавьте или обновите настройки ниже. Сохраните его root, location и настройки приложения.
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
Это фрагмент, а не готовая конфигурация сайта. Если порт 443 уже настроен, отредактируйте существующие директивы, чтобы избежать дублирования.
04Добавьте перенаправление
В отдельном HTTP-блоке направьте посетителей на HTTPS. Существующие специальные маршруты, например для проверки ACME, при необходимости сохраните отдельно.
server {
listen 80;
server_name example.com;
return 301 https://example.com$request_uri;
}
Убедитесь, что порт 443 разрешён в сетевых правилах сервера и на стороне площадки.
05Проверьте и примените
Сначала проверьте конфигурацию. Перезагрузка настроек выполнится только при успешной проверке.
sudo nginx -t && sudo nginx -s reload
Не перезапускайте сервер. Исправьте указанную ошибку и повторите проверку.
06Проверьте сайт
Откройте сайт по HTTPS: имя домена и срок сертификата должны быть верными, а браузер — принимать цепочку без предупреждений. Проверьте также переход с HTTP.
curl -I https://example.com
curl -I http://example.com
В ответе HTTP ожидается перенаправление на HTTPS. Сам HTTPS-адрес должен отвечать без ошибки проверки сертификата; код ответа зависит от вашего приложения.
Следите за сроком сертификата. После замены файлов повторите проверку и reload. Эти шаги сами по себе не включают автоматическое продление.
Если что-то пошло не так
NGINX сообщает о несовпадении ключа и сертификата
Используйте приватный ключ, с которым создавался запрос на этот сертификат. Файл ключа от другого выпуска не подойдёт.
Браузер не доверяет сертификату
Проверьте доменное имя, срок действия и полноту цепочки. В fullchain сертификат домена должен стоять перед промежуточными.
Появляется ошибка Permission denied
Проверьте путь, владельца, права доступа и ограничения окружения. Доступ к ключу нужен главному процессу NGINX; открывать его всем пользователям не требуется.
HTTPS-адрес не открывается
Проверьте успешность nginx -t, прослушивание порта 443, сетевые правила и соответствие DNS адресу сервера.
-----BEGIN CERTIFICATE-----
#здесь должен быть Ваш сертификат
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
#здесь должен быть промежуточный сертификат
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
#здесь должен быть корневой сертификат
-----END CERTIFICATE-----
Сохраняем получившийся файл как domain.crt, где domain - имя вашего домена. На самом деле как вы назовёте этот файл не имеет значение, важно содержимое, но для удобства лучше назвать в соответствии с подтверждаемым доменом.
Теперь загружаем два файла (domain.crt и domain.key) на сервер, желательно в директорию /etc/ssl/ или /etc/nginx/ssl/, но не обязательно.
Теперь настроим NGINX. Открываем файл конфигурации и в имеющейся секции server{}, описывающий Ваш домен, изменяем строчку
listen 80;
на
listen 443 ssl http2; # или просто listen 443 ssl;
ssl_certificate /etc/ssl/domain.crt;
ssl_certificate_key /etc/ssl/domain.key;
Обратите внимание: здесь указан полный путь до файлов с сертификатами и приватным ключом. Если Вы разместили эти файлы в другом месте, то и в этих строчках нужно внести изменение.
Если требуется переадресация с HTTP на HTTPS, то добавим еще одну секцию со следующим содержимым:
server {
if ($host = domain.ru) {
return 301 https://$host$request_uri;
}
listen 80;
server_name domain.ru;
return 404;
}
Соответственно заменяем domain.ru на адрес вашего сайта.
Теперь проверяем внесенные изменения:
Если здесь не вышло никаких проблем - значит мы не допустили никаких синтаксических ошибок(логические ошибки тут не проверяются). Перезапускаем NGINX:
Теперь проверяем свой сайт, заходим на него и слева от строки ввода в браузере должен быть замочек.
В дальнейшем достаточно только прописывать путь к новым сертификатам и ОБЯЗАТЕЛЬНО перезагружать NGINX.