Сайт FSA
06.05.2016

Настройка ssl на сервере nginx

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

Подробнее о настройке ssl можно узнать в официальной документации nginx.

На сайте StartSSL создаём сертификат “Web Server SSL/TLS Certificate”.

Первым получаем секретный ключ *.key. Сохраняем его в файл www.example.com.key. Данный ключ защищён паролем. Можно поступить двумя способами:

  1. создать файл с паролями от секретных ключей (каждый пароль указан на отдельной строке) и указать путь к нему в директиве ssl_password_file;
  2. расшифровывать ключ командой 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 ваши замечания по данной заметке.


Если данная заметка оказалась вам полезной, можете поблагодарить автора финансово.