Настройка ssl на сервере nginx
Каждый год приходится обновлять сертификат для сайтов, работающих через https. Решил описать весь процесс настройки. В качестве домена для демонстрации используется www.example.com.
Подробнее о настройке ssl можно узнать в официальной документации nginx.
На сайте StartSSL создаём сертификат “Web Server SSL/TLS Certificate”.
Первым получаем секретный ключ *.key. Сохраняем его в файл www.example.com.key. Данный ключ защищён паролем. Можно поступить двумя способами:
- создать файл с паролями от секретных ключей (каждый пароль указан на отдельной строке) и указать путь к нему в директиве
ssl_password_file
; - расшифровывать ключ командой
openssl rsa -in www.example.com.key -out www.example.com.nopass.key
.
Первый необходимый нам файл получен. Его нужно скормить директиве ssl_certificate_key
в конфигурации nginx.
Далее получаем сертификат в формате PEM. Сохраняем его в файл www.example.com.crt
. Обязательно проверяем, что в файле есть пустая строка в конце. Далее склеиваем с промежуточным сертификатом sub.class1.server.ca.pem
ссылку на который вы можете найти на странице получения сертификата или через меню сайта StartSSL:
cat www.example.com.crt sub.class1.server.ca.pem > www.example.com.pem
Файл www.example.com.pem
скармливаем директиве ssl_certificate
. Сертификат действителен на указанный вами домен третьего уровня, так и второго example.com. Добавить в сертификат дополнительные поддомены на бесплатном аккаунте startssl.com нельзя. Если на одном IP адресе требуется создать несколько SSL-сайтов можно воспользоваться SNI (Server Name Indication) - технология установки нескольких SSL сертификатов на один IP Поддержка SNI есть во всех современных браузерах. Проверить включена ли данная технология в вашем nginx можно командой nginx -V:
# nginx -V
nginx version: nginx/1.10.0
built with OpenSSL 1.0.2h 3 May 2016
TLS SNI support enabled
...
В выводе должно быть отображено сообщение TLS SNI support enabled
.
Настроим параметры SSL.
ssl_session_timeout 10m; # Увеличим время жизни сессий, по умолчанию 5 минут
ssl_session_cache shared:SSL:10m; # Размер разделяемого процесссами кэша
# ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Версия 1.9.1 и более поздних это значение по умолчанию, можно не указывать
# ssl_ciphers "EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:
# EECDH+aRSA+SHA256:EECDH:EDH+aRSA:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4";
# ssl_prefer_server_ciphers on; # Установить более высокий приоритет серверным шифрам, чем клиентским
ssl_password_file ssl/ssl.passwd; # Файл с паролями от ключей (по одному на строку)
При таком значении ssl_protocols
отключены некоторые небезопасные протоколы (начиная с nginx 1.9.1 это значение по умолчанию), однако могут возникнуть проблемы с доступом для пользователей Internet Explorer под Windows XP.
`Параметр ssl_ciphers здесь разбит на 2 строки для удобочитаемости. Описывает разрешённые шифры. Шифры задаются в формате, поддерживаемом библиотекой OpenSSL. В данном случае значение параметра я просто скопировал с сайта http://айри.рф/. За подробностями можете перейти по ссылке.
Если мы хотим распространить параметры настройки для всех сайтов, то данный код необходимо поместить в секцию http файла конфигурации.
Создаём виртуальный HTTPS-сервер и включаем SSL. Полученные на первом этапе файлы www.example.com.pem и www.example.com.key размещаем в папке ssl в папке настроек nginx (или любом другом месте по вкусу).
server {
listen 443 ssl http2;
ssl_certificate ssl/www.example.com.pem; # Сертификат данного виртуального сервера и промежуточный сертификат StartSSL
ssl_certificate_key ssl/www.example.com.key; # Секретный ключ
# Другие настройки вашего сайта
}
Указывать ssl on не обязательно, и.к. это равнозначно использованию ssl в параметре listen.
Начиная с версии nginx 1.9 имеется поддержка протокола HTTP/2. В данной конфигурации мы активируем этот протокол. Для старых версий nginx можно использовать spdy
.
При необходимости можно перенести некоторые настройки ssl из секции http в секцию server.
Для безопасности для папки ssl/ желательно установить права 700 и отдать её root. Все содержащиеся в них ключи, сертификаты и файл с паролями также отдать root и установить права доступа 600.
На этом настройку можно считать законченной. Можете убедиться, что ваш сайт https://www.example.com/ доступен и браузер принимает сертификат.
P.S. Отличный генератор конфигурации для веб-серверов
Теперь проще и удобнее использовать бесплатные сертификаты от сервисов с API для получения сертификатов: Let’s Encrypt, ZeroSSL и др.
Обратите внимание, что заметки могут обновляться со временем. Это может быть как исправление найденных ошибок, так и доработка содержания с целью более полного раскрытия темы. Информация об изменениях доступна в репозитории на github. Там же вы можете оставить в Issue ваши замечания по данной заметке.
Если данная заметка оказалась вам полезной, можете поблагодарить автора финансово.