Модуль ngx_http_ssl_module
- Пример конфигурации
- Директивы
- ssl
- ssl_buffer_size
- ssl_certificate
- ssl_certificate_key
- ssl_ciphers
- ssl_client_certificate
- ssl_conf_command
- ssl_crl
- ssl_dhparam
- ssl_early_data
- ssl_ecdh_curve
- ssl_ocsp
- ssl_ocsp_cache
- ssl_ocsp_responder
- 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_stapling
- ssl_stapling_file
- ssl_stapling_responder
- ssl_stapling_verify
- ssl_trusted_certificate
- ssl_verify_client
- ssl_verify_depth
- Обработка ошибок
- Встроенные переменные
Модуль ngx_http_ssl_module предоставляет необходимую поддержку HTTPS.
Этот модуль не компилируется по умолчанию, его необходимо включить с помощью параметра конфигурации --with-http_ssl_module.
Для работы этого модуля требуется библиотека OpenSSL.
Пример конфигурации
Для снижения нагрузки процессора рекомендуется
- установить количество рабочих процессов равное количеству процессоров,
- включить keep-alive соединения,
- включить общий кэш сессий,
- отключить встроенный кэш сессий,
- и, возможно, увеличить время жизни сессии (по умолчанию 5 минут):
worker_processes auto;
http {
...
server {
listen 443 ssl;
keepalive_timeout 70;
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 on | off; |
|---|---|
| Значение по умолчанию: | ssl off; |
| Контекст: | http, server |
Эта директива устарела в версии 1.15.0 и была удалена в версии 1.25.1. Вместо неё следует использовать параметр ssl директивы listen.
| Синтаксис: | ssl_buffer_size size; |
|---|---|
| Значение по умолчанию: | ssl_buffer_size 16k; |
| Контекст: | http, server |
Эта директива появилась в версии 1.5.9.
Устанавливает размер буфера, используемого для отправки данных.
По умолчанию размер буфера составляет 16 КБ, что соответствует минимальной дополнительной нагрузке при отправке больших ответов. Для минимизации времени до первой байтовой отправки (TTFB) может быть полезно использовать меньшие значения, например:
ssl_buffer_size 4k;
| Синтаксис: | ssl_certificate file; |
|---|---|
| Значение по умолчанию: | — |
| Контекст: | http, server |
Указывает file с сертификатом в формате PEM для данного виртуального сервера. Если необходимо указать промежуточные сертификаты в дополнение к основному сертификату, они должны быть указаны в том же файле в следующем порядке: основной сертификат сначала, затем промежуточные сертификаты. В том же файле может быть указан секретный ключ в формате PEM.
С версии 1.11.0, эта директива может быть указана несколько раз для загрузки сертификатов разных типов, например, RSA и ECDSA:
server {
listen 443 ssl;
server_name example.com;
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-рукопожатия, и это может негативно сказаться на производительности.
Вместо file (1.15.10) можно указать значение data:$variable, что загружает сертификат из переменной без использования промежуточных файлов. Обратите внимание, что неправильное использование этого синтаксиса может иметь последствия для безопасности, например, запись данных секретного ключа в журнал ошибок.
Следует помнить, что из-за ограничений протокола HTTPS для максимальной совместимости виртуальные сервера должны слушать на различных IP-адресах.
| Синтаксис: | ssl_certificate_key file; |
|---|---|
| Значение по умолчанию: | — |
| Контекст: | http, server |
Указывает file с секретным ключом в формате PEM для данного виртуального сервера.
Вместо file (1.7.9) можно указать значение 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; |
| Контекст: | http, server |
Указывает поддерживаемые шифры. Шифры указываются в формате, понятном библиотеке OpenSSL, например:
ssl_ciphers ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
Полный список можно посмотреть, используя команду «openssl ciphers».
Предыдущие версии nginx использовали другие шифры по умолчанию.
| Синтаксис: | ssl_client_certificate file; |
|---|---|
| Значение по умолчанию: | — |
| Контекст: | http, server |
Указывает файл file с доверенными сертификатами CA в формате PEM, используемый для проверки сертификатов клиентов и ответов OCSP, если включен ssl_stapling.
Список сертификатов будет отправлен клиентам. Если этого не требуется, можно использовать директиву ssl_trusted_certificate.
| Синтаксис: | ssl_conf_command name value; |
|---|---|
| Значение по умолчанию: | — |
| Контекст: | http, server |
Эта директива появилась в версии 1.19.4.
Устанавливает произвольные конфигурационные команды OpenSSL команды.
Директива поддерживается при использовании 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; |
|---|---|
| Значение по умолчанию: | — |
| Контекст: | http, server |
Эта директива появилась в версии 0.8.7.
Указывает файл file с отмененными сертификатами (CRL) в формате PEM, используемый для проверки сертификатов клиентов.
| Синтаксис: | ssl_dhparam file; |
|---|---|
| Значение по умолчанию: | — |
| Контекст: | http, server |
Эта директива появилась в версии 0.7.2.
Указывает файл file с параметрами DH для шифров DHE.
По умолчанию параметры не устанавливаются, и поэтому шифры DHE не будут использоваться.
До версии 1.11.0 по умолчанию использовались встроенные параметры.
| Синтаксис: | ssl_early_data on | off; |
|---|---|
| Значение по умолчанию: | ssl_early_data off; |
| Контекст: | http, server |
Эта директива появилась в версии 1.15.3.
Включает или отключает TLS 1.3 ранние данные.
Запросы, отправленные в рамках ранних данных, подвержены атакам повторения. Для защиты от таких атак на уровне приложения следует использовать переменную $ssl_early_data.
proxy_set_header Early-Data $ssl_early_data;
Директива поддерживается при использовании OpenSSL 1.1.1 или выше (1.15.4) и BoringSSL.
| Синтаксис: | ssl_ecdh_curve curve; |
|---|---|
| По умолчанию: | ssl_ecdh_curve auto; |
| Контекст: | http, server |
Данная директива появилась в версиях 1.1.0 и 1.0.6.
Указывает кривую 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_ocsp on |
off |
leaf; |
|---|---|
| По умолчанию: | ssl_ocsp off; |
| Контекст: | http, server |
Данная директива появилась в версии 1.19.0.
Включает проверку OCSP цепочки сертификатов клиента. Параметр leaf включает проверку только сертификата клиента.
Для работы проверки OCSP директива ssl_verify_client должна быть установлена в значение on или optional.
Для разрешения имени хоста OCSP-отправителя также должна быть указана директива resolver.
Пример:
ssl_verify_client on; ssl_ocsp on; resolver 192.0.2.1;
| Синтаксис: | ssl_ocsp_cache
off |
[shared:name:size]; |
|---|---|
| По умолчанию: | ssl_ocsp_cache off; |
| Контекст: | http, server |
Данная директива появилась в версии 1.19.0.
Устанавливает name и size кэша, который хранит статус сертификатов клиентов для проверки OCSP. Кэш общий для всех процессов-работников. Кэш с тем же именем может использоваться в нескольких виртуальных серверах.
Параметр off запрещает использование кэша.
| Синтаксис: | ssl_ocsp_responder url; |
|---|---|
| По умолчанию: | — |
| Контекст: | http, server |
Данная директива появилась в версии 1.19.0.
Переопределяет URL OCSP-отправителя, указанный в расширении сертификата «Authority Information Access» для проверки сертификатов клиентов.
Поддерживаются только OCSP-отправители «http://»:
ssl_ocsp_responder http://ocsp.example.com/;
| Синтаксис: | ssl_password_file file; |
|---|---|
| По умолчанию: | — |
| Контекст: | http, server |
Данная директива появилась в версии 1.7.3.
Указывает файл file с паролями для секретных ключей, где каждый пароль указан на отдельной строке. Пароли пробуются по очереди при загрузке ключа.
Пример:
http {
ssl_password_file /etc/keys/global.pass;
...
server {
server_name www1.example.com;
ssl_certificate_key /etc/keys/first.key;
}
server {
server_name www2.example.com;
# 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; |
| Контекст: | http, server |
Указывает, что при использовании протоколов SSLv3 и TLS должны предпочтительно использоваться шифры сервера, а не клиента.
| Синтаксис: | ssl_protocols
[SSLv2]
[SSLv3]
[TLSv1]
[TLSv1.1]
[TLSv1.2]
[TLSv1.3]; |
|---|---|
| По умолчанию: | ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; |
| Контекст: | http, server |
Включает указанные протоколы.
Если директива указана на уровне сервера, то используется значение от сервера по умолчанию. Подробности см. в разделе «Выбор виртуального сервера».
ПараметрыTLSv1.1иTLSv1.2(1.1.13, 1.0.12) работают только при использовании 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; |
| Контекст: | http, server |
Данная директива появилась в версии 1.19.4.
Если включено, то рукопожатия 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; |
| Контекст: | http, server |
Устанавливает типы и размеры кэшей, хранящих параметры сессии. Кэш может быть любого из следующих типов:
off- использование кэша сессий строго запрещено: nginx явно сообщает клиенту, что сессии не могут быть повторно использованы.
none- использование кэша сессий мягко запрещено: nginx сообщает клиенту, что сессии могут быть повторно использованы, но не фактически хранит параметры сессии в кэше.
builtin- кэш, встроенный в OpenSSL; используется только одним процессом-работником. Размер кэша задаётся в сессиях. Если размер не указан, он равен 20480 сессиям. Использование встроенного кэша может привести к фрагментации памяти.
- кэш, общий для всех процессов-работников. Размер кэша задаётся в байтах; один мегабайт может хранить около 4000 сессий. Каждый общий кэш должен иметь произвольное имя. Кэш с тем же именем может использоваться в нескольких виртуальных серверах. Также используется для автоматического создания, хранения и периодической смены ключей билетов TLS-сессии (1.23.2), если не настроено явно с помощью директивы ssl_session_ticket_key.
Оба типа кэшей могут использоваться одновременно, например:
ssl_session_cache builtin:1000 shared:SSL:10m;
но использование только общего кэша без встроенного кэша должно быть более эффективным.
| Синтаксис: | ssl_session_ticket_key file; |
|---|---|
| По умолчанию: | — |
| Контекст: | http, server |
Данная директива появилась в версии 1.5.7.
Устанавливает 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; |
| Контекст: | http, server |
Включает или отключает возобновление сессии через билеты TLS-сессии.
| Синтаксис: | ssl_session_timeout time; |
|---|---|
| По умолчанию: | ssl_session_timeout 5m; |
| Контекст: | http, server |
Указывает время, в течение которого клиент может повторно использовать параметры сессии.
| Синтаксис: | ssl_stapling on | off; |
|---|---|
| По умолчанию: | ssl_stapling off; |
| Контекст: | http, server |
Данная директива появилась в версии 1.3.7.
Включает или отключает закрепление ответов OCSP сервером. Пример:
ssl_stapling on; resolver 192.0.2.1;
Для работы закрепления OCSP, сертифиакт выдавшего сертификат сервера должен быть известен. Если файл ssl_certificate не содержит промежуточных сертификатов, сертификат выдавшего сертификат сервера должен быть в файле ssl_trusted_certificate.
Для разрешения имени хоста OCSP-отправителя также должна быть указана директива resolver.
| Синтаксис: | ssl_stapling_file file; |
|---|---|
| По умолчанию: | — |
| Контекст: | http, server |
Данная директива появилась в версии 1.3.7.
При установке, закреплённый ответ OCSP будет взят из указанного file вместо запроса к OCSP-отправителю, указанному в сертификате сервера.
Файл должен быть в формате DER, как полученный с помощью команды «openssl ocsp».
| Синтаксис: | ssl_stapling_responder url; |
|---|---|
| Значение по умолчанию: | — |
| Контекст: | http, server |
Эта директива появилась в версии 1.3.7.
Заменяет URL OCSP-ответчика, указанный в расширении сертификата «Доступ к информации об авторитете».
Поддерживаются только OCSP-ответчики типа «http://»:
ssl_stapling_responder http://ocsp.example.com/;
| Синтаксис: | ssl_stapling_verify on | off; |
|---|---|
| Значение по умолчанию: | ssl_stapling_verify off; |
| Контекст: | http, server |
Эта директива появилась в версии 1.3.7.
Включает или отключает проверку OCSP-ответов сервером.
Для работы проверки, сертификат издателя сертификата сервера, корневой сертификат и все промежуточные сертификаты должны быть настроены как доверенные с помощью директивы ssl_trusted_certificate.
| Синтаксис: | ssl_trusted_certificate file; |
|---|---|
| Значение по умолчанию: | — |
| Контекст: | http, server |
Эта директива появилась в версии 1.3.7.
Указывает file с доверенными сертификатами CA в формате PEM, используемом для проверки сертификатов клиентов и OCSP-ответов, если включен ssl_stapling.
В отличие от набора сертификатов, заданного с помощью ssl_client_certificate, список этих сертификатов не будет отправлен клиентам.
| Синтаксис: | ssl_verify_client
on | off |
optional | optional_no_ca; |
|---|---|
| Значение по умолчанию: | ssl_verify_client off; |
| Контекст: | http, server |
Включает проверку сертификатов клиентов. Результат проверки хранится в переменной $ssl_client_verify.
Параметр optional (0.8.7+) запрашивает сертификат клиента и проверяет его, если сертификат есть.
Параметр optional_no_ca (1.3.8, 1.2.5) запрашивает сертификат клиента, но не требует, чтобы он был подписан доверенным сертификатом CA. Это предназначено для случаев, когда внешняя служба выполняет фактическую проверку сертификата. Содержимое сертификата доступно через переменную $ssl_client_cert.
| Синтаксис: | ssl_verify_depth number; |
|---|---|
| Значение по умолчанию: | ssl_verify_depth 1; |
| Контекст: | http, server |
Устанавливает глубину проверки в цепочке сертификатов клиента.
Обработка ошибок
Модуль ngx_http_ssl_module поддерживает несколько нестандартных кодов ошибок, которые могут использоваться для перенаправлений с помощью директивы error_page:
- 495
- произошла ошибка во время проверки сертификата клиента;
- 496
- клиент не предоставил требуемый сертификат;
- 497
- обычный запрос отправлен на порт HTTPS.
Перенаправление происходит после полной обработки запроса и доступности переменных, таких как $request_uri, $uri, $args и других.
Встроенные переменные
Модуль ngx_http_ssl_module поддерживает встроенные переменные:
$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_escaped_cert- возвращает сертификат клиента в формате PEM (urlencoded) для установленного SSL-соединения (1.13.5);
$ssl_client_cert- возвращает сертификат клиента в формате PEM для установленного SSL-соединения, при этом каждая строка, кроме первой, дополняется символом табуляции; это предназначено для использования в директиве proxy_set_header;
Переменная устарела, следует использовать переменную
$ssl_client_escaped_certвместо неё. $ssl_client_fingerprint- возвращает SHA1 отпечаток сертификата клиента для установленного SSL-соединения (1.7.1);
$ssl_client_i_dn- возвращает строку «issuer DN» сертификата клиента для установленного SSL-соединения в соответствии с RFC 2253 (1.11.6);
$ssl_client_i_dn_legacy- возвращает строку «issuer DN» сертификата клиента для установленного SSL-соединения;
До версии 1.11.6 имя переменной было
$ssl_client_i_dn. -
$ssl_client_raw_cert - возвращает сертификат клиента в формате PEM для установленного SSL-соединения;
$ssl_client_s_dn- возвращает строку «subject DN» сертификата клиента для установленного SSL-соединения в соответствии с RFC 2253 (1.11.6);
$ssl_client_s_dn_legacy- возвращает строку «subject DN» сертификата клиента для установленного SSL-соединения;
До версии 1.11.6 имя переменной было
$ssl_client_s_dn. $ssl_client_serial- возвращает серийный номер сертификата клиента для установленного SSL-соединения;
$ssl_client_v_end- возвращает конечную дату сертификата клиента (1.11.7);
$ssl_client_v_remain- возвращает количество дней до истечения срока действия сертификата клиента (1.11.7);
$ssl_client_v_start- возвращает начальную дату сертификата клиента (1.11.7);
$ssl_client_verify- возвращает результат проверки сертификата клиента: «
SUCCESS», «FAILED:reason», и «NONE», если сертификат отсутствовал;До версии 1.11.7 результат «
FAILED» не содержал строкуreason. $ssl_curve- возвращает выбранную кривую, используемую для обмена ключами SSL-соединения (1.21.5). Известные кривые перечислены по именам, неизвестные — в шестнадцатеричном формате, например:
prime256v1
Переменная поддерживается только при использовании OpenSSL версии 3.0 или выше. С более старыми версиями значение переменной будет пустой строкой.
$ssl_curves- возвращает список кривых, поддерживаемых клиентом (1.11.7). Известные кривые перечислены по именам, неизвестные — в шестнадцатеричном формате, например:
0x001d:prime256v1:secp521r1:secp384r1
Переменная поддерживается только при использовании OpenSSL версии 1.0.2 или выше. С более старыми версиями значение переменной будет пустой строкой.
Переменная доступна только для новых сеансов.
$ssl_early_data- возвращает «
1», если используется TLS 1.3 ранние данные и рукопожатие не завершено, в противном случае «» (1.15.3). $ssl_protocol- возвращает протокол установленного SSL-соединения;
$ssl_server_name- возвращает имя сервера, запрошенное через SNI (1.7.0);
$ssl_session_id- возвращает идентификатор сессии установленного SSL-соединения;
$ssl_session_reused- возвращает «
r», если SSL-сессия была повторно использована, или «.» в противном случае (1.5.11).
© 2002-2021 Igor Sysoev
© 2011-2024 Nginx, Inc.
Licensed under the BSD License.
https://nginx.org/en/docs/http/ngx_http_ssl_module.html