Модуль ngx_stream_ssl_module

Пример конфигурации
Директивы
     ssl_certificate
     ssl_certificate_key
     ssl_ciphers
     ssl_dhparam
     ssl_ecdh_curve
     ssl_handshake_timeout
     ssl_password_file
     ssl_prefer_server_ciphers
     ssl_protocols
     ssl_session_cache
     ssl_session_ticket_key
     ssl_session_tickets
     ssl_session_timeout

Модуль ngx_stream_ssl_module (1.9.0) обеспечивает необходимую поддержку для работы прокси-сервера по протоколу SSL/TLS. По умолчанию этот модуль не собирается, его сборку необходимо разрешить с помощью конфигурационного параметра --with-stream_ssl_module.

Пример конфигурации

Для уменьшения загрузки процессора рекомендуется

worker_processes auto;

stream {

    ...

    server {
        listen              12345 ssl;

        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers         AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
        ssl_certificate     /usr/local/nginx/conf/cert.pem;
        ssl_certificate_key /usr/local/nginx/conf/cert.key;
        ssl_session_cache   shared:SSL:10m;
        ssl_session_timeout 10m;

        ...
    }

Директивы

Синтаксис: ssl_certificate файл;
Умолчание:
Контекст: stream, server

Указывает файл с сертификатом в формате PEM для данного сервера. Если вместе с основным сертификатом нужно указать промежуточные, то они должны находиться в этом же файле в следующем порядке — сначала основной сертификат, а затем промежуточные. В этом же файле может находиться секретный ключ в формате PEM.

Синтаксис: ssl_certificate_key файл;
Умолчание:
Контекст: stream, server

Указывает файл с секретным ключом в формате PEM для данного сервера.

Вместо файла можно указать значение engine:имя:id, которое загружает ключ с указанным id из OpenSSL engine с заданным именем.

Синтаксис: ssl_ciphers шифры;
Умолчание:
ssl_ciphers HIGH:!aNULL:!MD5;
Контекст: stream, server

Описывает разрешённые шифры. Шифры задаются в формате, поддерживаемом библиотекой OpenSSL, например:

ssl_ciphers ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;

Полный список можно посмотреть с помощью команды “openssl ciphers”.

Синтаксис: ssl_dhparam файл;
Умолчание:
Контекст: stream, server

Указывает файл с параметрами для шифров с обменом EDH-ключами.

Синтаксис: ssl_ecdh_curve кривая;
Умолчание:
ssl_ecdh_curve prime256v1;
Контекст: stream, server

Задаёт кривую для ECDHE-шифров.

Синтаксис: ssl_handshake_timeout время;
Умолчание:
ssl_handshake_timeout 60s;
Контекст: stream, server

Задаёт таймаут для завершения операции SSL handshake.

Синтаксис: ssl_password_file файл;
Умолчание:
Контекст: stream, server

Задаёт файл с паролями от секретных ключей, где каждый пароль указан на отдельной строке. Пароли применяются по очереди в момент загрузки ключа.

Пример:

stream {
    ssl_password_file /etc/keys/global.pass;
    ...

    server {
        listen 127.0.0.1:12345;
        ssl_certificate_key /etc/keys/first.key;
    }

    server {
        listen 127.0.0.1:12346;

        # вместо файла можно указать именованный канал
        ssl_password_file /etc/keys/fifo;
        ssl_certificate_key /etc/keys/second.key;
    }
}

Синтаксис: ssl_prefer_server_ciphers on | off;
Умолчание:
ssl_prefer_server_ciphers off;
Контекст: stream, server

Указывает, чтобы при использовании протоколов SSLv3 и TLS серверные шифры были более приоритетны, чем клиентские.

Синтаксис: ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];
Умолчание:
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
Контекст: stream, server

Разрешает указанные протоколы. Параметры TLSv1.1 и TLSv1.2 работают только при использовании библиотеки OpenSSL версии 1.0.1 и выше.

Синтаксис: ssl_session_cache off | none | [builtin[:размер]] [shared:название:размер];
Умолчание:
ssl_session_cache none;
Контекст: stream, server

Задаёт тип и размеры кэшей для хранения параметров сессий. Тип кэша может быть следующим:

off
жёсткое запрещение использования кэша сессий: nginx явно сообщает клиенту, что сессии не могут использоваться повторно.
none
мягкое запрещение использования кэша сессий: nginx сообщает клиенту, что сессии могут использоваться повторно, но на самом деле не хранит параметры сессии в кэше.
builtin
встроенный в OpenSSL кэш, используется в рамках только одного рабочего процесса. Размер кэша задаётся в сессиях. Если размер не задан, то он равен 20480 сессиям. Использование встроенного кэша может вести к фрагментации памяти.
shared
кэш, разделяемый между всеми рабочими процессами. Размер кэша задаётся в байтах, в 1 мегабайт может поместиться около 4000 сессий. У каждого разделяемого кэша должно быть произвольное название. Кэш с одинаковым названием может использоваться в нескольких серверах.

Можно использовать одновременно оба типа кэша, например:

ssl_session_cache builtin:1000 shared:SSL:10m;

однако использование только разделяемого кэша без встроенного должно быть более эффективным.

Синтаксис: ssl_session_ticket_key файл;
Умолчание:
Контекст: stream, server

Задаёт файл с секретным ключом, применяемым при шифровании и расшифровании TLS session tickets. Директива необходима, если один и тот же ключ нужно использовать на нескольких серверах. По умолчанию используется случайно сгенерированный ключ.

Если указано несколько ключей, то только первый ключ используется для шифрования TLS session tickets. Это позволяет настроить ротацию ключей, например:

ssl_session_ticket_key current.key;
ssl_session_ticket_key previous.key;

Файл должен содержать 48 байт случайных данных и может быть создан следующей командой:

openssl rand 48 > ticket.key

Синтаксис: ssl_session_tickets on | off;
Умолчание:
ssl_session_tickets on;
Контекст: stream, server

Разрешает или запрещает возобновление сессий при помощи TLS session tickets.

Синтаксис: ssl_session_timeout время;
Умолчание:
ssl_session_timeout 5m;
Контекст: stream, server

Задаёт время, в течение которого клиент может повторно использовать параметры сессии, хранящейся в кэше.