view xml/ru/docs/mail/ngx_mail_ssl_module.xml @ 2769:16f6fa718be2

Updated TLSv1.3 support notes. Previous notes described some early development snapshot of OpenSSL 1.1.1 with disabled TLSv1.3 by default. It was then enabled in the first alpha. Further, the updated text covers later major releases such as OpenSSL 3.0.
author Sergey Kandaurov <pluknet@nginx.com>
date Thu, 30 Sep 2021 16:29:20 +0300
parents ff357b676c2e
children 4add6ae1296f
line wrap: on
line source

<?xml version="1.0"?>

<!--
  Copyright (C) 2006, 2007 Anton Yuzhaninov
  Copyright (C) Nginx, Inc.
  -->

<!DOCTYPE module SYSTEM "../../../../dtd/module.dtd">

<module name="Модуль ngx_mail_ssl_module"
        link="/ru/docs/mail/ngx_mail_ssl_module.html"
        lang="ru"
        rev="23">

<section id="summary">

<para>
Модуль <literal>ngx_mail_ssl_module</literal> обеспечивает работу
почтового прокси-сервера по протоколу SSL/TLS.
</para>

<para>
По умолчанию этот модуль не собирается, его сборку необходимо
разрешить с помощью конфигурационного параметра
<literal>--with-mail_ssl_module</literal>.
<note>
Для сборки и работы этого модуля нужна библиотека
<link url="http://www.openssl.org">OpenSSL</link>.
</note>
</para>

</section>


<section id="example" name="Пример конфигурации">

<para>
Для уменьшения загрузки процессора рекомендуется
<list type="bullet">

<listitem>
установить число
<link doc="../ngx_core_module.xml" id="worker_processes">рабочих процессов</link>
равным числу процессоров,
</listitem>

<listitem>
включить <link id="ssl_session_cache_shared">разделяемый</link> кэш сессий,
</listitem>

<listitem>
выключить <link id="ssl_session_cache_builtin">встроенный</link> кэш сессий
</listitem>

<listitem>
и, возможно, увеличить <link id="ssl_session_timeout">время жизни</link> сессии
(по умолчанию 5 минут):
</listitem>

</list>

<example>
<emphasis>worker_processes auto;</emphasis>

mail {

    ...

    server {
        listen              993 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;
        <emphasis>ssl_session_cache   shared:SSL:10m;</emphasis>
        <emphasis>ssl_session_timeout 10m;</emphasis>

        ...
    }
</example>
</para>

</section>


<section id="directives" name="Директивы">

<directive name="ssl">
<syntax><literal>on</literal> | <literal>off</literal></syntax>
<default>off</default>
<context>mail</context>
<context>server</context>

<para>
Эта директива устарела в версии 1.15.0.
Вместо неё следует
использовать параметр <literal>ssl</literal>
директивы <link doc="ngx_mail_core_module.xml" id="listen"/>.
</para>

</directive>


<directive name="ssl_certificate">
<syntax><value>файл</value></syntax>
<default/>
<context>mail</context>
<context>server</context>

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

<para>
Начиная с версии 1.11.0
эта директива может быть указана несколько раз
для загрузки сертификатов разных типов, например RSA и ECDSA:
<example>
server {
    listen              993 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;

    ...
}
</example>
<note>
Возможность задавать отдельные цепочки сертификатов для разных сертификатов
есть только в OpenSSL 1.0.2 и выше.
Для более старых версий следует указывать только одну цепочку сертификатов.
</note>
</para>

<para id="ssl_certificate_data">
Вместо <value>файла</value> можно указать значение
<literal>data</literal>:<value>сертификат</value> (1.15.10),
при котором сертификат загружается
без использования промежуточных файлов.
При этом следует учитывать, что ненадлежащее использование
подобного синтаксиса может быть небезопасно,
например данные секретного ключа могут попасть в
<link doc="../ngx_core_module.xml" id="error_log">лог ошибок</link>.
</para>

</directive>


<directive name="ssl_certificate_key">
<syntax><value>файл</value></syntax>
<default/>
<context>mail</context>
<context>server</context>

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

<para>
Вместо <value>файла</value> можно указать значение
<literal>engine</literal>:<value>имя</value>:<value>id</value> (1.7.9),
которое загружает ключ с указанным <value>id</value>
из OpenSSL engine с заданным <value>именем</value>.
</para>

<para id="ssl_certificate_key_data">
Вместо <value>файла</value> можно указать значение
<literal>data</literal>:<value>ключ</value> (1.15.10),
при котором секретный ключ загружается
без использования промежуточных файлов.
При этом следует учитывать, что ненадлежащее использование
подобного синтаксиса может быть небезопасно,
например данные секретного ключа могут попасть в
<link doc="../ngx_core_module.xml" id="error_log">лог ошибок</link>.
</para>

</directive>


<directive name="ssl_ciphers">
<syntax><value>шифры</value></syntax>
<default>HIGH:!aNULL:!MD5</default>
<context>mail</context>
<context>server</context>

<para>
Описывает разрешённые шифры.
Шифры задаются в формате, поддерживаемом библиотекой
OpenSSL, например:
<example>
ssl_ciphers ALL:!aNULL:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
</example>
</para>

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

<para>
<note>
В предыдущих версиях nginx по умолчанию использовались
<link doc="../http/configuring_https_servers.xml" id="compatibility">другие</link>
шифры.
</note>
</para>

</directive>


<directive name="ssl_client_certificate">
<syntax><value>файл</value></syntax>
<default/>
<context>mail</context>
<context>server</context>
<appeared-in>1.7.11</appeared-in>

<para>
Указывает <value>файл</value> с доверенными сертификатами CA в формате
PEM, которые используются для
<link id="ssl_verify_client">проверки</link> клиентских сертификатов.
</para>

<para>
Список сертификатов будет отправляться клиентам.
Если это нежелательно, можно воспользоваться директивой
<link id="ssl_trusted_certificate"/>.
</para>

</directive>


<directive name="ssl_conf_command">
<syntax><value>command</value></syntax>
<default/>
<context>mail</context>
<context>server</context>
<appeared-in>1.19.4</appeared-in>

<para>
Задаёт произвольные конфигурационные
<link url="https://www.openssl.org/docs/man1.1.1/man3/SSL_CONF_cmd.html">команды</link>
OpenSSL.
<note>
Директива поддерживается при использовании OpenSSL 1.0.2 и выше.
</note>
</para>

<para>
На одном уровне может быть указано
несколько директив <literal>ssl_conf_command</literal>:
<example>
ssl_conf_command Options PrioritizeChaCha;
ssl_conf_command Ciphersuites TLS_CHACHA20_POLY1305_SHA256;
</example>
Директивы наследуются с предыдущего уровня конфигурации при условии, что
на данном уровне не описаны свои директивы <literal>ssl_conf_command</literal>.
</para>

<para>
<note>
Следует учитывать, что изменение настроек OpenSSL напрямую
может привести к неожиданному поведению.
</note>
</para>

</directive>


<directive name="ssl_crl">
<syntax><value>файл</value></syntax>
<default/>
<context>mail</context>
<context>server</context>
<appeared-in>1.7.11</appeared-in>

<para>
Указывает <value>файл</value> с отозванными сертификатами (CRL)
в формате PEM, используемыми для
<link id="ssl_verify_client">проверки</link> клиентских сертификатов.
</para>

</directive>


<directive name="ssl_dhparam">
<syntax><value>файл</value></syntax>
<default/>
<context>mail</context>
<context>server</context>
<appeared-in>0.7.2</appeared-in>

<para>
Указывает <value>файл</value> с параметрами для DHE-шифров.
</para>

<para>
По умолчанию параметры не заданы,
и соответственно DHE-шифры не будут использоваться.
<note>
До версии 1.11.0 по умолчанию использовались встроенные параметры.
</note>
</para>

</directive>


<directive name="ssl_ecdh_curve">
<syntax><value>кривая</value></syntax>
<default>auto</default>
<context>mail</context>
<context>server</context>
<appeared-in>1.1.0</appeared-in>
<appeared-in>1.0.6</appeared-in>

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

<para>
При использовании OpenSSL 1.0.2 и выше
можно указывать несколько кривых (1.11.0), например:
<example>
ssl_ecdh_curve prime256v1:secp384r1;
</example>
</para>

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

<para>
<note>
До версии 1.11.0
по умолчанию использовалась кривая <literal>prime256v1</literal>.
</note>
</para>

<para>
<note>
При использовании OpenSSL 1.0.2 и выше
директива задаёт список кривых, поддерживаемых сервером.
Поэтому для работы ECDSA-сертификатов
важно, чтобы список включал кривые, используемые в сертификатах.
</note>
</para>

</directive>


<directive name="ssl_password_file">
<syntax><value>файл</value></syntax>
<default/>
<context>mail</context>
<context>server</context>
<appeared-in>1.7.3</appeared-in>

<para>
Задаёт <value>файл</value> с паролями от
<link id="ssl_certificate_key">секретных ключей</link>,
где каждый пароль указан на отдельной строке.
Пароли применяются по очереди в момент загрузки ключа.
</para>

<para>
Пример:
<example>
mail {
    ssl_password_file /etc/keys/global.pass;
    ...

    server {
        server_name mail1.example.com;
        ssl_certificate_key /etc/keys/first.key;
    }

    server {
        server_name mail2.example.com;

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

</directive>


<directive name="ssl_prefer_server_ciphers">
<syntax><literal>on</literal> | <literal>off</literal></syntax>
<default>off</default>
<context>mail</context>
<context>server</context>

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

</directive>


<directive name="ssl_protocols">
<syntax>
    [<literal>SSLv2</literal>]
    [<literal>SSLv3</literal>]
    [<literal>TLSv1</literal>]
    [<literal>TLSv1.1</literal>]
    [<literal>TLSv1.2</literal>]
    [<literal>TLSv1.3</literal>]</syntax>
<default>TLSv1 TLSv1.1 TLSv1.2</default>
<context>mail</context>
<context>server</context>

<para>
Разрешает указанные протоколы.
<note>
Параметры <literal>TLSv1.1</literal> и <literal>TLSv1.2</literal>
(1.1.13, 1.0.12) работают только при использовании OpenSSL 1.0.1 и выше.
</note>
<note>
Параметр <literal>TLSv1.3</literal> (1.13.0) работает только
при использовании OpenSSL 1.1.1 и выше.
</note>
</para>

</directive>


<directive name="ssl_session_cache">
<syntax>
    <literal>off</literal> |
    <literal>none</literal> |
    [<literal>builtin</literal>[:<value>размер</value>]]
    [<literal>shared</literal>:<value>название</value>:<value>размер</value>]</syntax>
<default>none</default>
<context>mail</context>
<context>server</context>

<para>
Задаёт тип и размеры кэшей для хранения параметров сессий.
Тип кэша может быть следующим:
<list type="tag" compact="no">

<tag-name><literal>off</literal></tag-name>
<tag-desc>
жёсткое запрещение использования кэша сессий:
nginx явно сообщает клиенту, что сессии не могут использоваться повторно.
</tag-desc>

<tag-name><literal>none</literal></tag-name>
<tag-desc>
мягкое запрещение использования кэша сессий:
nginx сообщает клиенту, что сессии могут использоваться повторно, но
на самом деле не хранит параметры сессии в кэше.
</tag-desc>

<tag-name id="ssl_session_cache_builtin"><literal>builtin</literal></tag-name>
<tag-desc>
встроенный в OpenSSL кэш, используется в рамках только одного рабочего процесса.
Размер кэша задаётся в сессиях.
Если размер не задан, то он равен 20480 сессиям.
Использование встроенного кэша может вести к фрагментации памяти.
</tag-desc>

<tag-name id="ssl_session_cache_shared"><literal>shared</literal></tag-name>
<tag-desc>
кэш, разделяемый между всеми рабочими процессами.
Размер кэша задаётся в байтах, в 1 мегабайт может поместиться
около 4000 сессий.
У каждого разделяемого кэша должно быть произвольное название.
Кэш с одинаковым названием может использоваться в нескольких
серверах.
</tag-desc>

</list>
</para>

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

</directive>


<directive name="ssl_session_ticket_key">
<syntax><value>файл</value></syntax>
<default/>
<context>mail</context>
<context>server</context>
<appeared-in>1.5.7</appeared-in>

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

<para>
Если указано несколько ключей, то только первый ключ
используется для шифрования TLS session tickets.
Это позволяет настроить ротацию ключей, например:
<example>
ssl_session_ticket_key current.key;
ssl_session_ticket_key previous.key;
</example>
</para>

<para>
<value>Файл</value> должен содержать 80 или 48 байт случайных данных
и может быть создан следующей командой:
<example>
openssl rand 80 > ticket.key
</example>
В зависимости от размера файла для шифрования будет использоваться либо
AES256 (для 80-байтных ключей, 1.11.8), либо AES128 (для 48-байтных ключей).
</para>

</directive>


<directive name="ssl_session_tickets">
<syntax><literal>on</literal> | <literal>off</literal></syntax>
<default>on</default>
<context>mail</context>
<context>server</context>
<appeared-in>1.5.9</appeared-in>

<para>
Разрешает или запрещает возобновление сессий при помощи
<link url="https://tools.ietf.org/html/rfc5077">TLS session tickets</link>.
</para>

</directive>


<directive name="ssl_session_timeout">
<syntax><value>время</value></syntax>
<default>5m</default>
<context>mail</context>
<context>server</context>

<para>
Задаёт время, в течение которого клиент может повторно
использовать параметры сессии.
</para>

</directive>


<directive name="ssl_trusted_certificate">
<syntax><value>файл</value></syntax>
<default/>
<context>mail</context>
<context>server</context>
<appeared-in>1.7.11</appeared-in>

<para>
Задаёт <value>файл</value> с доверенными сертификатами CA в формате PEM,
которые используются для
<link id="ssl_verify_client">проверки</link> клиентских сертификатов.
</para>

<para>
В отличие от <link id="ssl_client_certificate"/>, список этих сертификатов
не будет отправляться клиентам.
</para>

</directive>


<directive name="ssl_verify_client">
<syntax>
    <literal>on</literal> | <literal>off</literal> |
    <literal>optional</literal> | <literal>optional_no_ca</literal></syntax>
<default>off</default>
<context>mail</context>
<context>server</context>
<appeared-in>1.7.11</appeared-in>

<para>
Разрешает проверку клиентских сертификатов.
Результат проверки передаётся в заголовке
<header>Auth-SSL-Verify</header> в запросе
<link doc="ngx_mail_auth_http_module.xml" id="auth_http">аутентификации</link>.
</para>

<para>
Параметр <literal>optional</literal> запрашивает клиентский
сертификат, и если сертификат был предоставлен, проверяет его.
</para>

<para>
Параметр <literal>optional_no_ca</literal>
запрашивает сертификат
клиента, но не требует, чтобы он был подписан доверенным сертификатом CA.
Это предназначено для случаев, когда фактическая проверка сертификата
осуществляется внешним по отношению к nginx’у сервисом.
Содержимое сертификата доступно в запросах,
<link doc="ngx_mail_auth_http_module.xml"
      id="auth_http_pass_client_cert">посылаемых</link>
на сервер аутентификации.
</para>

</directive>


<directive name="ssl_verify_depth">
<syntax><value>число</value></syntax>
<default>1</default>
<context>mail</context>
<context>server</context>
<appeared-in>1.7.11</appeared-in>

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

</directive>


<directive name="starttls">
<syntax>
  <literal>on</literal> |
  <literal>off</literal> |
  <literal>only</literal></syntax>
<default>off</default>
<context>mail</context>
<context>server</context>

<para>
<list type="tag">

<tag-name><literal>on</literal></tag-name>
<tag-desc>
разрешить использование команд <literal>STLS</literal> для POP3
и <literal>STARTTLS</literal> для IMAP и SMTP;
</tag-desc>

<tag-name><literal>off</literal></tag-name>
<tag-desc>
запретить использование команд <literal>STLS</literal>
и <literal>STARTTLS</literal>;
</tag-desc>

<tag-name><literal>only</literal></tag-name>
<tag-desc>
требовать предварительного перехода на TLS.
</tag-desc>

</list>
</para>

</directive>

</section>

</module>