Модуль ngx_http_ssl_module

nginx


english
עברית
日本語
русский
türkçe

новости [en]

об nginx
скачать
безопасность [en]
pgp ключи [en]
документация
введение [en]
howto
faq
trac
wiki
ссылки [en]
книги [en]
поддержка
пожертвования [en]
nginx.com
@nginxorg
Пример конфигурации
Директивы
     ssl
     ssl_certificate
     ssl_certificate_key
     ssl_ciphers
     ssl_client_certificate
     ssl_crl
     ssl_dhparam
     ssl_prefer_server_ciphers
     ssl_protocols
     ssl_session_cache
     ssl_session_timeout
     ssl_verify_client
     ssl_verify_depth
Обработка ошибок
Встроенные переменные

Модуль ngx_http_ssl_module обеспечивает работу по протоколу HTTPS.

По умолчанию этот модуль не собирается, его сборку необходимо разрешить с помощью конфигурационного параметра --with-http_ssl_module.

Для сборки и работы этого модуля нужна библиотека OpenSSL.

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

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

  • установить число рабочих процессов равным числу процессоров,
  • разрешить keep-alive соединения,
  • включить разделяемый кэш сессий,
  • выключить встроенный кэш сессий
  • и, возможно, увеличить время жизни сессии (по умолчанию 5 минут):

worker_processes 2;

http {

    ...

    server {
        listen              443;
        keepalive_timeout   70;

        ssl                 on;
        ssl_protocols       SSLv3 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 on | off;
умолчание:
ssl off;
контекст: http, server

Разрешает протокол HTTPS для данного виртуального сервера.

синтаксис: ssl_certificate файл;
умолчание:
контекст: http, server

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

Нужно иметь в виду, что из-за ограничения протокола HTTPS виртуальные серверы должны слушать на разных IP-адресах:

server {
    listen          192.168.1.1:443;
    server_name     one.example.com;
    ssl_certificate /usr/local/nginx/conf/one.example.com.cert;
    ...
}

server {
    listen          192.168.1.2:443;
    server_name     two.example.com;
    ssl_certificate /usr/local/nginx/conf/two.example.com.cert;
    ...
}

иначе для второго сайта будет выдаваться сертификат первого сервера.

синтаксис: ssl_certificate_key файл;
умолчание:
контекст: http, server

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

синтаксис: ssl_ciphers шифры;
умолчание:
ssl_ciphers HIGH:!ADH:!MD5;
контекст: http, server

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

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

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

синтаксис: ssl_client_certificate файл;
умолчание:
контекст: http, server

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

синтаксис: ssl_crl файл;
умолчание:
контекст: http, server

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

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

синтаксис: ssl_dhparam файл;
умолчание:
контекст: http, server

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

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

синтаксис: ssl_prefer_server_ciphers on | off;
умолчание:
ssl_prefer_server_ciphers off;
контекст: http, server

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

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

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

Параметры TLSv1.1 и TLSv1.2 поддерживаются только начиная с версий 1.1.13 и 1.0.12, поэтому при использовании OpenSSL версии 1.0.1 и выше на старых версиях nginx эти протоколы работать будут, однако их нельзя будет отключить.

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

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

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

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

ssl_session_cache builtin:1000 shared:SSL:10m;

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

синтаксис: ssl_session_timeout время;
умолчание:
ssl_session_timeout 5m;
контекст: http, server

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

синтаксис: ssl_verify_client on | off | optional;
умолчание:
ssl_verify_client off;
контекст: http, server

Разрешает проверку клиентских сертификатов. Параметр optional (0.8.7+) запрашивает сертификат клиента и проверяет его, если он предоставлен. Результат проверки можно узнать в переменной $ssl_client_verify.

синтаксис: ssl_verify_depth число;
умолчание:
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_cipher
возвращает строку используемых шифров для установленного SSL-соединения;
$ssl_client_cert
возвращает клиентский сертификат для установленного SSL-соединения в формате PEM перед каждой строкой которого, кроме первой, вставляется символ табуляции; предназначена для использования в директиве proxy_set_header;
$ssl_client_raw_cert
возвращает клиентский сертификат для установленного SSL-соединения в формате PEM;
$ssl_client_serial
возвращает серийный номер клиентского сертификата для установленного SSL-соединения;
$ssl_client_s_dn
возвращает строку “subject DN” клиентского сертификата для установленного SSL-соединения;
$ssl_client_i_dn
возвращает строку “issuer DN” клиентского сертификата для установленного SSL-соединения;
$ssl_client_verify
возвращает результат проверки клиентского сертификата: “SUCCESS”, “FAILED” и, если сертификат не был предоставлен — “NONE”;
$ssl_protocol
возвращает протокол установленного SSL-соединения;
$ssl_session_id
возвращает идентификатор сессии установленного SSL-соединения.