Персональный
сайт
Игоря
Сысоева


 
english
 
sysoev.ru
 
nginx
 поехали!    
 документация    
 поддержка    
 изменения    
 скачать    
 ссылки    
 
mod_accel
mod_realip
mod_deflate
программирование
всякая всячина
windows
freebsd
apache
pppd
unix
web
 
обо мне
для писем
для денег
 

Директивы модуля ngx_http_ssl_module

 

30.07.2008

Модуль ngx_http_ssl_module обеспечивает работу по протоколу HTTPS. Поддерживается проверка сертификатов клиентов с двумя ограничениями:

  • нельзя задать список отменённых сертификатов (revocation lists);
  • если в файле, заданном директивой ssl_certificate, указана цепочка сертификатов, то при проверке клиентских сертификатов nginx также будет использовать и сертификаты этих промежуточных CA.

По умолчанию модуль не собирается, нужно разрешить его сборку при конфигурировании параметром --with-http_ssl_module. Для сборки и работы этого модуля нужна библиотека OpenSSL.

Содержание

Пример конфигурации
Директивы
ssl
ssl_certificate
ssl_certificate_key
ssl_client_certificate
ssl_ciphers
ssl_prefer_server_ciphers
ssl_protocols
ssl_verify_client
ssl_verify_depth
ssl_session_cache
ssl_session_timeout
Обработка ошибок
Встроенные переменные

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

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

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

http {

    ...

    server {
        listen               443;
        keepalive_timeout    70;

        ssl                  on;
        ssl_protocols        SSLv3 TLSv1;
        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;

        ...
    }

Директивы


syntax: ssl [on|off]
default: ssl off
context: http, server

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


syntax: ssl_certificate файл
default: ssl_certificate cert.pem
context: 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;
         ...
     }
иначе для второго сайта будет выдаваться сертификат первого сервера.


syntax: ssl_certificate_key файл
default: ssl_certificate_key cert.pem
context: http, server

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


syntax: ssl_client_certificate файл
default: нет
context: http, server

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


syntax: ssl_ciphers шифры
default: ssl_ciphers ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
context: http, server

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

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

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


syntax: ssl_prefer_server_ciphers [on|off]
default: ssl_prefer_server_ciphers off
context: http, server

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


syntax: ssl_protocols [SSLv2] [SSLv3] [TLSv1]
default: ssl_protocols SSLv2 SSLv3 TLSv1
context: http, server

Директива разрешает указанные протоколы.


syntax: ssl_verify_client on|off|ask
default: ssl_verify_client off
context: http, server

Директива разрешает проверку клиентских сертификатов. Параметр ask (0.7.7+) только запрашивает сертификат клиента, но не проверяет его.


syntax: ssl_verify_depth число
default: ssl_verify_depth 1
context: http, server

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


syntax: ssl_session_cache off|none|[builtin[:размер]] [shared:название:размер]
default: ssl_session_cache none
context: http, server

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

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

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

ssl_session_cache  builtin:1000  shared:SSL:10m;
однако использование только разделяемого кэша без встроенного должно быть более эффективным.


syntax: ssl_session_timeout время
default: ssl_session_timeout 5m
context: http, server

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


Обработка ошибок

Модуль ngx_http_ssl_module поддерживает несколько нестандартных кодов ошибок, которые можно использовать для перенаправления с помощью директивы error_page:

  • 495 — при проверке клиентского сертификата произошла ошибка;
  • 496 — клиент не предоставил требуемый сертификат;
  • 497 — обычный запрос был послан на порт HTTPS.

Перенаправление делается после того, как запрос полностью разобран и доступны такие переменные, как $request_uri, $uri, $arg и прочие.

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

Модуль 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_protocol возвращает протокол установленного SSL-соединения;

(C) Игорь Сысоев
http://sysoev.ru