Spec-Zone.ru › nginx

Модуль ngx_stream_ssl_module

  • Пример конфигурации
  • Директивы
  • ssl_alpn
  • ssl_certificate
  • ssl_certificate_key
  • ssl_ciphers
  • ssl_client_certificate
  • ssl_conf_command
  • ssl_crl
  • ssl_dhparam
  • ssl_ecdh_curve
  • ssl_handshake_timeout
  • ssl_password_file
  • ssl_prefer_server_ciphers
  • ssl_protocols
  • ssl_reject_handshake
  • ssl_session_cache
  • ssl_session_ticket_key
  • ssl_session_tickets
  • ssl_session_timeout
  • ssl_trusted_certificate
  • ssl_verify_client
  • ssl_verify_depth
  • Встроенные переменные

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

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

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

  • установить количество рабочих процессов равным количеству процессоров,
  • включить кэширование сессий shared,
  • отключить кэширование сессий builtin,
  • и возможно увеличить срок действия сессии lifetime (по умолчанию 5 минут):
worker_processes auto;

stream {

    ...

    server {
        listen              12345 ssl;

        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        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_alpn protocol ...;
Значение по умолчанию: —
Контекст: stream, server

Данная директива появилась в версии 1.21.4.

Указывает список поддерживаемых ALPN протоколов. Один из протоколов должен быть переговорен, если клиент использует ALPN:

map $ssl_alpn_protocol $proxy {
    h2                127.0.0.1:8001;
    http/1.1          127.0.0.1:8002;
}

server {
    listen      12346;
    proxy_pass  $proxy;
    ssl_alpn    h2 http/1.1;
}
Синтаксис: ssl_certificate file;
Значение по умолчанию: —
Контекст: stream, server

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

Начиная с версии 1.11.0, эта директива может быть указана несколько раз для загрузки сертификатов разных типов, например, RSA и ECDSA:

server {
    listen              12345 ssl;

    ssl_certificate     example.com.rsa.crt;
    ssl_certificate_key example.com.rsa.key;

    ssl_certificate     example.com.ecdsa.crt;
    ssl_certificate_key example.com.ecdsa.key;

    ...
}
Только OpenSSL 1.0.2 или выше поддерживает отдельные цепочки сертификатов для разных сертификатов. В более старых версиях может быть использована только одна цепочка сертификатов.

Начиная с версии 1.15.9, в имени file можно использовать переменные при использовании OpenSSL 1.0.2 или выше:

ssl_certificate     $ssl_server_name.crt;
ssl_certificate_key $ssl_server_name.key;

Обратите внимание, что использование переменных подразумевает загрузку сертификата для каждого SSL-handshake, и это может негативно сказаться на производительности.

Вместо file (1.15.10) можно указать значение data:$variable, что загружает сертификат из переменной без использования промежуточных файлов. Обратите внимание, что некорректное использование данного синтаксиса может иметь последствия для безопасности, например, запись данных секретного ключа в лог ошибок.

Синтаксис: ssl_certificate_key file;
Значение по умолчанию: —
Контекст: stream, server

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

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

Вместо file (1.15.10) можно указать data:$variable, что загружает секретный ключ из переменной без использования промежуточных файлов. Неправильное использование данного синтаксиса может иметь последствия для безопасности, например, запись данных секретного ключа в лог ошибок.

Начиная с версии 1.15.9, в имени file можно использовать переменные при использовании OpenSSL 1.0.2 или выше.

Синтаксис: ssl_ciphers ciphers;
Значение по умолчанию: ssl_ciphers HIGH:!aNULL:!MD5;
Контекст: stream, server

Указывает включенные шифры. Шифры указываются в формате, понятном библиотеке OpenSSL, например:

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

Полный список можно посмотреть, используя команду “openssl ciphers”.

Синтаксис: ssl_client_certificate file;
Значение по умолчанию: —
Контекст: stream, server

Данная директива появилась в версии 1.11.8.

Указывает file с доверенными сертификатами CA в формате PEM, используемыми для проверки сертификатов клиентов.

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

Синтаксис: ssl_conf_command name value;
Значение по умолчанию: —
Контекст: stream, server

Данная директива появилась в версии 1.19.4.

Устанавливает произвольные конфигурационные команды OpenSSL SSL_CONF_cmd.

Директива поддерживается при использовании OpenSSL 1.0.2 или выше.

Несколько ssl_conf_command директив могут быть указаны на одном уровне:

ssl_conf_command Options PrioritizeChaCha;
ssl_conf_command Ciphersuites TLS_CHACHA20_POLY1305_SHA256;

Эти директивы наследуются с предыдущего уровня конфигурации только если на текущем уровне не определены ssl_conf_command директивы.

Обратите внимание, что прямое конфигурирование OpenSSL может привести к неожиданному поведению.
Синтаксис: ssl_crl file;
Значение по умолчанию: —
Контекст: stream, server

Данная директива появилась в версии 1.11.8.

Указывает file с отозванными сертификатами (CRL) в формате PEM, используемыми для проверки сертификатов клиентов.

Синтаксис: ssl_dhparam file;
Значение по умолчанию: —
Контекст: stream, server

Указывает file с параметрами DH для шифров DHE.

По умолчанию параметры не заданы, и поэтому шифры DHE не будут использоваться.

До версии 1.11.0 параметры по умолчанию были встроенными.
Синтаксис: ssl_ecdh_curve curve;
Значение по умолчанию: ssl_ecdh_curve auto;
Контекст: stream, server

Указывает curve для шифров ECDHE.

При использовании OpenSSL 1.0.2 или выше, можно указать несколько кривых (1.11.0), например:

ssl_ecdh_curve prime256v1:secp384r1;

Специальное значение auto (1.11.0) инструктирует nginx использовать встроенный список в библиотеке OpenSSL при использовании OpenSSL 1.0.2 или выше, или prime256v1 с более старыми версиями.

До версии 1.11.0 по умолчанию использовалась prime256v1 кривая.
При использовании OpenSSL 1.0.2 или выше, данная директива устанавливает список кривых, поддерживаемых сервером. Таким образом, для работы сертификатов ECDSA важно включить кривые, используемые в сертификатах.
Синтаксис: ssl_handshake_timeout time;
Значение по умолчанию: ssl_handshake_timeout 60s;
Контекст: stream, server

Указывает таймаут для завершения SSL-handshake.

Синтаксис: ssl_password_file file;
Значение по умолчанию: —
Контекст: stream, server

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

Пример:

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;

        # named pipe can also be used instead of a file
        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] [TLSv1.3];
Значение по умолчанию: ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
Контекст: stream, server

Включает указанные протоколы.

Если директива указана на уровне сервера, может быть использовано значение по умолчанию для сервера.

Параметры TLSv1.1 и TLSv1.2 работают только при использовании OpenSSL 1.0.1 или более поздней версии.
Параметр TLSv1.3 (1.13.0) работает только при использовании OpenSSL 1.1.1 или более поздней версии.
Параметр TLSv1.3 используется по умолчанию начиная с версии 1.23.4.
Синтаксис: ssl_reject_handshake on | off;
Значение по умолчанию: ssl_reject_handshake off;
Контекст: stream, server

Эта директива появилась в версии 1.25.5.

Если включено, рукопожатия SSL в блоке сервера будут отклоняться.

Например, в следующей конфигурации рукопожатия SSL с именами серверов, отличными от example.com, отклоняются:

server {
    listen               443 ssl default_server;
    ssl_reject_handshake on;
}

server {
    listen              443 ssl;
    server_name         example.com;
    ssl_certificate     example.com.crt;
    ssl_certificate_key example.com.key;
}
Синтаксис: ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
Значение по умолчанию: ssl_session_cache none;
Контекст: stream, server

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

off
использование кэша сеансов запрещено: nginx явно сообщает клиенту, что сеансы не могут быть повторно использованы.
none
использование кэша сеансов мягко запрещено: nginx сообщает клиенту, что сеансы могут быть повторно использованы, но фактически не сохраняет параметры сеанса в кэше.
builtin
кэш, встроенный в OpenSSL; используется только одним процессом-рабочим. Размер кэша указывается в сессиях. Если размер не указан, он равен 20480 сессиям. Использование встроенного кэша может привести к фрагментации памяти.
shared
кэш, общий для всех процессов-рабочих. Размер кэша указывается в байтах; один мегабайт может хранить около 4000 сессий. Каждый общий кэш должен иметь произвольное имя. Кэш с одинаковым именем может использоваться на нескольких серверах. Также используется для автоматического создания, хранения и периодической смены ключей билетов TLS сеансов (1.23.2), если явно не настроено с помощью директивы ssl_session_ticket_key.

Оба типа кэшей могут использоваться одновременно, например:

ssl_session_cache builtin:1000 shared:SSL:10m;

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

Синтаксис: ssl_session_ticket_key file;
Значение по умолчанию: —
Контекст: stream, server

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

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

ssl_session_ticket_key current.key;
ssl_session_ticket_key previous.key;

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

openssl rand 80 > ticket.key

В зависимости от размера файла для шифрования используется либо AES256 (для 80-байтовых ключей, 1.11.8), либо AES128 (для 48-байтовых ключей).

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

Включает или отключает возобновление сеанса с помощью билетов сеанса TLS.

Синтаксис: ssl_session_timeout time;
Значение по умолчанию: ssl_session_timeout 5m;
Контекст: stream, server

Указывает время, в течение которого клиент может повторно использовать параметры сеанса.

Синтаксис: ssl_trusted_certificate file;
Значение по умолчанию: —
Контекст: stream, server

Эта директива появилась в версии 1.11.8.

Указывает file с доверенными сертификатами CA в формате PEM, используемыми для проверки сертификатов клиентов.

В отличие от сертификата, установленного с помощью ssl_client_certificate, список этих сертификатов не будет отправлен клиентам.

Синтаксис: ssl_verify_client on | off | optional | optional_no_ca;
Значение по умолчанию: ssl_verify_client off;
Контекст: stream, server

Эта директива появилась в версии 1.11.8.

Включает проверку сертификатов клиентов. Результат проверки сохраняется в переменной $ssl_client_verify. Если при проверке сертификата клиента произошла ошибка или клиент не предоставил требуемый сертификат, соединение закрывается.

Параметр optional запрашивает сертификат клиента и проверяет его, если сертификат присутствует.

Параметр optional_no_ca запрашивает сертификат клиента, но не требует, чтобы он был подписан доверенным сертификатом CA. Это предназначено для использования в случаях, когда внешний по отношению к nginx сервис выполняет фактическую проверку сертификата. Содержимое сертификата доступно через переменную $ssl_client_cert.

Синтаксис: ssl_verify_depth number;
Значение по умолчанию: ssl_verify_depth 1;
Контекст: stream, server

Эта директива появилась в версии 1.11.8.

Устанавливает глубину проверки в цепочке сертификатов клиента.

Встроенные переменные

Модуль ngx_stream_ssl_module поддерживает переменные начиная с версии 1.11.2.

$ssl_alpn_protocol
возвращает протокол, выбранный ALPN во время рукопожатия SSL, или пустую строку в противном случае (1.21.4);
$ssl_cipher
возвращает имя шифра, используемого для установленного SSL-соединения;
$ssl_ciphers
возвращает список поддерживаемых клиентом шифров (1.11.7). Известные шифры перечислены по именам, неизвестные — в шестнадцатеричном формате, например:
AES128-SHA:AES256-SHA:0x00ff
Переменная полностью поддерживается только при использовании OpenSSL версии 1.0.2 или выше. В более старых версиях переменная доступна только для новых сессий и перечисляет только известные шифры.
$ssl_client_cert
возвращает сертификат клиента в формате PEM для установленного SSL-соединения, при этом каждая строка, кроме первой, дополняется символом табуляции (1.11.8);
$ssl_client_fingerprint
возвращает отпечаток SHA1 сертификата клиента для установленного SSL-соединения (1.11.8);
$ssl_client_i_dn
возвращает строку «issuer DN» сертификата клиента для установленного SSL-соединения в соответствии с RFC 2253 (1.11.8);
$ssl_client_raw_cert
возвращает сертификат клиента в формате PEM для установленного SSL-соединения (1.11.8);
$ssl_client_s_dn
возвращает строку «subject DN» сертификата клиента для установленного SSL-соединения в соответствии с RFC 2253 (1.11.8);
$ssl_client_serial
возвращает серийный номер сертификата клиента для установленного SSL-соединения (1.11.8);
$ssl_client_v_end
возвращает дату окончания действия сертификата клиента (1.11.8);
$ssl_client_v_remain
возвращает количество дней до истечения срока действия сертификата клиента (1.11.8);
$ssl_client_v_start
возвращает дату начала действия сертификата клиента (1.11.8);
$ssl_client_verify
возвращает результат проверки сертификата клиента (1.11.8): «SUCCESS», «FAILED:reason», и «NONE», если сертификат отсутствовал;
$ssl_curve
возвращает согласованную кривую, используемую для процесса обмена ключами SSL-рукопожатия (1.21.5). Известные кривые перечислены по именам, неизвестные — в шестнадцатеричном формате, например:
prime256v1
Переменная поддерживается только при использовании OpenSSL версии 3.0 или выше. В более старых версиях значение переменной будет пустой строкой.
$ssl_curves
возвращает список кривых, поддерживаемых клиентом (1.11.7). Известные кривые перечислены по именам, неизвестные — в шестнадцатеричном формате, например:
0x001d:prime256v1:secp521r1:secp384r1
Переменная поддерживается только при использовании OpenSSL версии 1.0.2 или выше. В более старых версиях значение переменной будет пустой строкой.
Переменная доступна только для новых сессий.
$ssl_protocol
возвращает протокол установленного SSL-соединения;
$ssl_server_name
возвращает имя сервера, запрошенное через SNI;
$ssl_session_id
возвращает идентификатор сессии установленного SSL-соединения;
$ssl_session_reused
возвращает «r», если SSL-сессия была повторно использована, или «.» в противном случае.

© 2002-2021 Igor Sysoev
© 2011-2024 Nginx, Inc.
Licensed under the BSD License.
https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API