Spec-Zone.ru › Apache HTTP Server

Модуль Apache mod_tls

Описание: Реализация TLS v1.2 и v1.3 в памяти с безопасностью Rust с использованием библиотеки rustls
Статус: Экспериментальный
Идентификатор модуля: tls_module
Файл исходного кода: mod_tls.c
Совместимость: Доступно в версии 2.4.52 и более поздних

Краткое описание

mod_tls — это альтернатива mod_ssl для обеспечения https-сервиса. Его функционал является подмножеством, описанным более подробно ниже. Он может использоваться как дополнение к mod_ssl, например, оба модуля могут быть загружены одновременно.

mod_tls, написанный на C, использует реализацию TLS на Rust под названием rustls через свой C-интерфейс rustls-ffi. Это обеспечивает безопасную криптографию и обработку протоколов со сравнимой производительностью.

Он может быть настроен для фронтенд- и бэкенд-соединений. Директивы конфигурации в основном аналогичны mod_ssl.

TLS в контексте VirtualHost

Listen 443
TLSEngine 443

<VirtualHost *:443>
  ServerName example.net
  TLSCertificate file_with_certificate.pem file_with_key.pem
  ...
</VirtualHost>

Выше приведена минимальная конфигурация. Вместо включения mod_tls в каждом виртуальном хосте, указывается порт для входящих TLS-соединений.

Вы не можете смешивать виртуальные хосты с mod_ssl и mod_tls на одном порту. Либо одно, либо другое. Поддерживаются SNI и ALPN. Вы можете использовать несколько виртуальных хостов на одном порту и смешивать протоколы, такие как http/1.1 и h2.

Сравнение функциональности с mod_ssl

Таблица ниже показывает сравнение функциональных возможностей mod_ssl и mod_tls. Если функция mod_ssl не указана здесь, она не поддерживается mod_tls. Вероятно, самое существенное отличие — отсутствие поддержки сертификатов клиента в текущей версии mod_tls.

Функция mod_ssl mod_tls Комментарий
TLS для фронтенда да да
TLS для бэкенда да да
TLS v1.3 да* да *)с последней OpenSSL
TLS v1.2 да да
TLS v1.0 да* нет *)если включено в OpenSSL
SNI виртуальные хосты да да
Сертификаты клиентов да нет
Сертификаты машины для бэкенда да да
OCSP Stapling да да* *)через mod_md
Проверка OCSP в бэкенде да нет* *)подпись будет проверена
Разрешенные версии TLS мин-макс мин
TLS шифры исключительный список предпочтительный/запрещенный
Порядок шифров TLS клиент/сервер клиент/сервер
TLS сессии да да
Строгость SNI по умолчанию нет по умолчанию да
Опции EnvVars полный набор ограниченный* *)см. список переменных
Опция ExportCertData клиент+сервер сервер
CA для бэкенда файл/каталог файл
Отзыва CRL да нет
TLS переподключение да* нет *)в TLS v1.2
Зашифрованные ключи сертификатов да нет

Протоколы TLS

mod_tls поддерживает протоколы TLS версии 1.2 и 1.3. Если когда-нибудь появится версия 1.4 и rustls ее поддержит, она также будет доступна.

В mod_tls настраивается минимальная версия, а не максимальная:

TLSProtocol TLSv1.3+

Это позволяет использовать только версию 1.3 и любые последующие версии при общении с вашим сервером или конкретным виртуальным хостом.

Шифры TLS

Список поддерживаемых шифров TLS в библиотеке rustls можно найти здесь. Все шифры TLS v1.3 поддерживаются. Для TLS v1.2 доступны только шифры, которые rustls считает безопасными.

mod_tls поддерживает следующие имена для шифров TLS:

  1. Присвоенное IANA имя, использующее `_` для разделения частей. Пример: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  2. Имя OpenSSL, использующее `-` в качестве разделителя (для 1.2). Пример: ECDHE-ECDSA-AES256-SHA384. Такие имена часто встречаются в документации. `mod_tls` определяет их для всех шифров TLS v1.2. Для шифров TLS v1.3 также поддерживаются имена, начинающиеся с TLS13_.
  3. Присвоенный IANA идентификатор, представляющий собой 16-битное числовое значение. Пример: 0xc024. Вы можете использовать его в конфигурациях как TLS_CIPHER_0xc024.

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

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

TLSCiphersPrefer ECDHE-ECDSA-AES256-SHA384
# or several
TLSCiphersPrefer ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305

Если вы укажете неизвестный шифр, конфигурация завершится ошибкой. Если вы укажете шифр, не поддерживаемый rustls (или больше не поддерживаемый в обновленной версии rustls по соображениям безопасности), mod_tls выведет сообщение WARNING, но продолжит работу.

Аналогичный механизм существует, если вы хотите отключить определенный шифр:

TLSCipherSuppress ECDHE-ECDSA-AES256-SHA384

Запрещенный шифр больше не будет использоваться. Если вы укажете неизвестный шифр, конфигурация завершится ошибкой. Если вы укажете шифр, не поддерживаемый rustls (или больше не поддерживаемый в обновленной версии rustls по соображениям безопасности), mod_tls выведет сообщение WARNING, но продолжит работу.

Виртуальные хосты

mod_tls использует SNI (Server Name Indicator) для выбора одного из настроенных виртуальных хостов, соответствующих порту, который обслуживается. Если клиент не предоставит SNI, будет выбран первый настроенный виртуальный хост. Если клиент предоставит SNI (как это делают все современные клиенты), он должен совпадать с одним виртуальным хостом (ServerName или ServerAlias) или подключение завершится ошибкой.

Как и в случае с mod_ssl, вы можете указать шифры и версии протоколов для базового сервера (глобального) и/или отдельных виртуальных хостов, которые выбираются клиентом по SNI.

Listen 443
TLSEngine 443

<VirtualHost *:443>
  ServerName example1.net
  TLSCertificate example1-cert.pem
  ...
</VirtualHost>

<VirtualHost *:443>
  ServerName example2.net
  TLSCertificate example2-cert.pem
  ...
  TLSProtocol v1.3+
</VirtualHost>

Приведенный выше пример показывает разные настройки TLS для виртуальных хостов на одном порту. Это поддерживается. example1 может быть достигнут через все версии TLS, а example2 допускает только v1.3 или более поздние версии.

Сертификаты ACME

Сертификаты ACME через mod_md поддерживаются, как и для mod_ssl. Минимальная конфигурация:

Listen 443
TLSEngine 443
MDomain example.net

<VirtualHost *:443>
  ServerName example.net
  ...
</VirtualHost>

OCSP Stapling

mod_tls не имеет собственной реализации для получения информации OCSP для сертификата. Однако он будет использовать ее для Stapling, если она предоставляется mod_md. См. документацию mod_md по включению этой функции.

Переменные TLS

Через директиву TLSOptions, несколько переменных помещаются в среду запросов и могут быть просмотрены, например, в скрипте CGI.

Имена переменных задаются mod_ssl. Обратите внимание, что это только подмножество многих переменных, которые предоставляет mod_ssl.

Переменная TLSOption Описание
SSL_TLS_SNI * индикатор имени сервера (SNI), отправленный клиентом
SSL_PROTOCOL * переговоренный протокол TLS
SSL_CIPHER * имя переговорённого шифра TLS
SSL_VERSION_INTERFACE StdEnvVars версия модуля
SSL_VERSION_LIBRARY StdEnvVars версия rustls-ffi
SSL_SECURE_RENEG StdEnvVars всегда `false`
SSL_COMPRESS_METHOD StdEnvVars всегда `false`
SSL_CIPHER_EXPORT StdEnvVars всегда `false`
SSL_CLIENT_VERIFY StdEnvVars всегда `false`
SSL_SESSION_RESUMED StdEnvVars либо `Resumed`, если клиент представил известный идентификатор TLS-сессии, либо `Initial` в противном случае
SSL_SERVER_CERT ExportCertData выбранный серверный сертификат в формате PEM

Переменная SSL_SESSION_ID намеренно не поддерживается, так как содержит конфиденциальную информацию.

Сертификаты клиентов

Хотя rustls поддерживает сертификаты клиентов в принципе, часть инфраструктуры для использования этих сертификатов на сервере не реализована.

К этим функциям относятся: списки отзыва, проверка расширений сертификатов и сопоставленной цепочки выдачи для проверки OCSP. Без них отзыв сертификатов клиента невозможен. Предложение аутентификации без отзыва не рассматривается.

Работа над этим будет продолжена, и поддержка сертификатов клиентов может стать доступной в будущей версии.

Директива TLSCertificate

Описание: добавляет сертификат и ключ (в кодировке PEM) на сервер/виртуальный хост.
Синтаксис:
TLSCertificate cert_file [key_file]
Контекст: конфигурация сервера, виртуальный хост
Статус: Экспериментальный
Модуль: mod_tls

Если вы не укажете отдельный файл ключа, ключ предполагается в первом файле. Вы можете добавить более одного сертификата на сервер/виртуальный хост. Затем выбирается первый сертификат, подходящий для клиента.

Путь может быть указан относительно корня сервера.

Директива TLSCiphersPrefer

Описание: определяет предпочтительные шифры.
Синтаксис:
TLSCiphersPrefer cipher(-list)
Контекст: конфигурация сервера, виртуальный хост
Статус: Экспериментальный
Модуль: mod_tls

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

Пример

TLSCiphersPrefer ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305

В примере 2 шифра имеют предпочтение перед другими, в порядке их упоминания.

Директива TLSCiphersSuppress

Описание: определяет шифры, которые не должны использоваться.
Синтаксис:
TLSCiphersSuppress cipher(-list)
Контекст: настройка сервера, виртуальный хост
Статус: Экспериментальный
Модуль: mod_tls

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

Пример

TLSCiphersSuppress ECDHE-ECDSA-CHACHA20-POLY1305

Пример удаляет шифр для использования в соединениях.

Директива TLSEngine

Описание: определяет, на каком адресе и порту модуль должен обрабатывать входящие подключения.
Синтаксис:
TLSEngine [address:]port
Контекст: настройка сервера
Статус: Экспериментальный
Модуль: mod_tls

Эта настройка задаётся на глобальном уровне, а не в отдельных <VirtualHost>. Она повлияет на все <VirtualHost> , которые соответствуют указанному адресу/порту. Вы можете использовать TLSEngine несколько раз, чтобы использовать более одного адреса/порта.

Пример

TLSEngine 443

В примере модулю mod_tls сообщается о необходимости обработки входящих подключений на порту 443 для всех слушателей.

Директива TLSHonorClientOrder

Описание: определяет, учитывается ли порядок шифров, поддерживаемых клиентом
Синтаксис:
TLSHonorClientOrder on|off
Значение по умолчанию:
TLSHonorClientOrder on
Контекст: настройка сервера, виртуальный хост
Статус: Экспериментальный
Модуль: mod_tls

TLSHonorClientOrder определяет, учитывается ли порядок шифров, поддерживаемых клиентом.

Директива TLSOptions

Описание: включает переменные SSL для запросов.
Синтаксис:
TLSOptions [+|-]option
Контекст: настройка сервера, виртуальный хост, каталог, .htaccess
Статус: Экспериментальный
Модуль: mod_tls

TLSOptions аналогично SSLOptions в mod_ssl. Она может быть установлена для каждого каталога/местоположения, и `option` может быть:

  • `StdEnvVars`: добавляет больше переменных в среду запроса, например, для передачи в обработку CGI и других приложений.
  • `ExportCertData`: добавляет переменные, связанные с сертификатом, в среду запроса.
  • `Defaults`: сбрасывает все параметры до их значений по умолчанию.

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

Вы можете настроить TLSOptions для каждого местоположения или в целом на сервере/виртуальном хосте. Префикс `-` отключает этот параметр, оставляя остальные без изменений. Префикс `+` эквивалентен записи параметра без префикса.

Значение `Defaults` может быть использовано для сброса любых параметров, унаследованных от других местоположений или виртуального хоста/сервера.

Пример

<Location /myplace/app>
  TLSOptions Defaults StdEnvVars
  ...
</Location>

Директива TLSProtocol

Описание: устанавливает минимальную версию протокола TLS для использования.
Синтаксис:
TLSProtocol version+
Значение по умолчанию:
TLSProtocol v1.2+
Контекст: настройка сервера, виртуальный хост
Статус: Экспериментальный
Модуль: mod_tls

По умолчанию `v1.2+`. Установка на `v1.3+` отключит TLSv1.2.

Директива TLSProxyCA

Описание: устанавливает корневые сертификаты для проверки сервера бэкенда.
Синтаксис:
TLSProxyCA file.pem
Контекст: настройка сервера, виртуальный хост, раздел прокси
Статус: Экспериментальный
Модуль: mod_tls

Директива TLSProxyCiphersPrefer

Описание: определяет предпочтительные шифры для подключения прокси.
Синтаксис:
TLSProxyCiphersPrefer cipher(-list)
Контекст: настройка сервера, виртуальный хост, раздел прокси
Статус: Экспериментальный
Модуль: mod_tls

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

Директива TLSProxyCiphersSuppress

Описание: определяет шифры, которые не должны использоваться для подключения прокси.
Синтаксис:
TLSProxyCiphersSuppress cipher(-list)
Контекст: настройка сервера, виртуальный хост, раздел прокси
Статус: Экспериментальный
Модуль: mod_tls

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

Директива TLSProxyEngine

Описание: включает TLS для подключений бэкенда.
Синтаксис:
TLSProxyEngine on|off
Контекст: настройка сервера, виртуальный хост, раздел прокси
Статус: Экспериментальный
Модуль: mod_tls

TLSProxyEngine аналогично SSLProxyEngine в mod_ssl.

Это может быть использовано в разделе сервера/виртуального хоста или <Proxy> для включения модуля для исходящих подключений с использованием mod_proxy.

Директива TLSProxyMachineCertificate

Описание: добавляет файл сертификата и ключа (в формате PEM) к настройке прокси.
Синтаксис:
TLSProxyMachineCertificate cert_file [key_file]
Контекст: настройка сервера, виртуальный хост, раздел прокси
Статус: Экспериментальный
Модуль: mod_tls

Сертификат используется для аутентификации на сервере бэкенда прокси.

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

Путь может быть указан относительно корня сервера.

Директива TLSProxyProtocol

Описание: устанавливает минимальную версию протокола TLS для использования в подключениях прокси.
Синтаксис:
TLSProxyProtocol version+
Значение по умолчанию:
TLSProxyProtocol v1.2+
Контекст: настройка сервера, виртуальный хост, раздел прокси
Статус: Экспериментальный
Модуль: mod_tls

По умолчанию `v1.2+`. Установка на `v1.3+` отключит TLSv1.2.

Директива TLSSessionCache

Описание: устанавливает кэш для возобновления сеансов TLS.
Синтаксис:
TLSSessionCache cache-spec
Контекст: настройка сервера
Статус: Экспериментальный
Модуль: mod_tls

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

Вы можете установить это на `none` или определить кэш, как в директиве SSLSessionCache модуля mod_ssl.

Если не настроено, `mod_tls` попытается создать кэш в общей памяти, используя спецификацию `shmcb:tls/session-cache`. Если это не удастся, будет выведено предупреждение, но сервер продолжит работу.

Директива TLSStrictSNI

Описание: вынуждает точное соответствие индикаторов клиента сервера (SNI) именам хостов.
Синтаксис:
TLSStrictSNI on|off
Значение по умолчанию:
TLSStrictSNI on
Контекст: настройка сервера
Статус: Экспериментальный
Модуль: mod_tls

Подключения клиентов с использованием SNI будут неуспешными, если соответствие не найдено.

© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/mod/mod_tls.html

Spec-Zone.ru

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