Apache Module mod_md
| Описание: | Управление доменами в виртуальных хостах, предоставление сертификатов через протокол ACME |
|---|---|
| Статус: | Экспериментальный |
| Идентификатор модуля: | md_module |
| Файл исходного кода: | mod_md.c |
| Совместимость: | Доступен в версии 2.4.30 и более поздних |
Обзор
Этот модуль управляет общими свойствами доменов для одного или нескольких виртуальных хостов. Он выполняет две основные задачи: во-первых, контролирует/обновляет сертификаты TLS через протокол ACME (RFC 8555). Сертификаты будут обновляться модулем до их истечения для предотвращения прерывания работы интернет-сервисов. Существуют способы отслеживания состояния всех управляемых таким образом сертификатов, а также конфигурации, которые позволят запускать собственные команды уведомления при обновлении, истечении срока действия и ошибках.
Во-вторых, mod_md предлагает альтернативную реализацию OCSP Stapling. Это работает как с управляемыми сертификатами, так и с сертификатами, которые вы настраиваете сами. OCSP Stapling является необходимым компонентом для любого сайта https:, влияющим на время загрузки страниц и, в зависимости от других настроек, на доступность страниц. Более подробная информация в разделе про stapling ниже.
По умолчанию, для управления сертификатами используется авторитет ACME Let's Encrypt, но можно настроить другого CA, поддерживающего этот протокол.
Пример простой конфигурации:
TLS в контексте VirtualHost
MDomain example.org
<VirtualHost *:443>
ServerName example.org
DocumentRoot htdocs/a
SSLEngine on
# no certificates specification
</VirtualHost> Эта настройка при запуске сервера свяжется с Let's Encrypt для запроса сертификата для домена. Если Let's Encrypt сможет подтвердить владение доменом, модуль извлечет сертификат и цепочку сертификатов, сохранит их в локальной файловой системе (см. MDStoreDir) и предоставит их при следующем перезапуске сервера mod_ssl.
Это происходит во время работы сервера. Все остальные хосты будут работать как и раньше. Пока сертификат недоступен, запросы на управляемый домен будут обрабатываться с кодом ошибки «503 Service Unavailable».
Предварительные требования
Для работы этого модуля требуется, чтобы был загружен модуль mod_watchdog.
Регистрация и продление сертификатов с помощью Let's Encrypt требуют, чтобы ваш сервер был доступен по порту 80 (http:) и/или порту 443 (https:) из открытого интернета. (Если ваш сервер настроен на использование DNS для проверок - подробнее об этом в разделе «сертификаты для поддоменов».)
Модуль выберет один из методов, предложенных Let's Encrypt. Обычно LE предлагает проверки на обоих портах и DNS, и Apache выбирает доступный метод.
Для определения доступного метода модуль проверяет порты, на которых работает Apache httpd. Если среди них есть порт 80, предполагается, что проверка http: (называемая http-01) доступна. Если сервер работает на порте 443, то проверка https: (называемая tls-alpn-01) также добавляется в список. (И если MDChallengeDns01 настроено, проверка dns-01 также добавляется.)
Если ваша настройка нестандартна, существуют два способа повлиять на этот процесс. Во-первых, обратитесь к MDPortMap, если сервер находится за прокси-сервером, например, брандмауэром. Во-вторых, вы можете полностью переопределить процесс угадывания модуля, настроив MDCAChallenges напрямую.
Проверки https:
Для проверки домена через протокол TLS тип проверки `tls-alpn-01` имеет соответствующее имя. Для этого требуется, чтобы сервер Apache работал на порте 443 (см. MDPortMap если вы настроили этот порт на другое значение).
Let's Encrypt откроет соединение TLS с Apache с использованием специального индикатора `acme-tls/1` (эта часть TLS называется ALPN, поэтому и название проверки. ALPN также используется браузерами для запроса соединения HTTP/2).
Так же, как и для протокола HTTP/2, для разрешения этого необходимо настроить:
Protocols h2 http/1.1 acme-tls/1
И тип проверки `tls-alpn-01` становится доступным.
Сертификаты для поддоменов
Сертификаты для поддоменов возможны, но не так просто использовать «из коробки». Let's Encrypt требует проверку типа `dns-01` для них. Другие типы не считаются достаточными.
Сложность здесь заключается в том, что Apache не может выполнить это самостоятельно. Как следует из названия, `dns-01` требует, чтобы вы указали определённые записи DNS для своего домена, содержащие некоторые данные проверки. Таким образом, вам нужно будет _изменить_ записи DNS вашего домена.
Если вы знаете как это сделать, вы можете интегрировать это с mod_md. Допустим, у вас есть скрипт для этого в `/usr/bin/acme-setup-dns`, вы настраиваете Apache следующим образом:
MDChallengeDns01 /usr/bin/acme-setup-dns
и Apache будет вызывать этот скрипт при необходимости создания/удаления записи DNS для проверки домена.
Предполагая, что вы хотите сертификат для `*.mydomain.com`, mod_md вызовет:
/usr/bin/acme-setup-dns setup mydomain.com challenge-data # this needs to remove all existing DNS TXT records for # _acme-challenge.mydomain.com and create a new one with # content "challenge-data"
и после этого он вызовет
/usr/bin/acme-setup-dns teardown mydomain.com # this needs to remove all existing DNS TXT records for # _acme-challenge.mydomain.com
Мониторинг
Apache имеет стандартный модуль для мониторинга: mod_status. mod_md добавляет раздел и упрощает мониторинг ваших доменов.
Вы увидите все ваши MD в алфавитном порядке, домены, которые они содержат, общий статус, сроки истечения и специфические настройки. Настройки показывают выбранные вами сроки продления (или значения по умолчанию), используемый CA и т. д.
Столбец «Обновление» покажет действия и описания ошибок для продления сертификатов. Это должно облегчить пользователям определение того, всё ли в порядке или что пошло не так.
Если с MD возникнет ошибка, она также будет отображена здесь. Это позволит вам оценить проблемы, не копаясь в логах сервера.
Также доступен новый обработчик «md-status», предоставляющий информацию о MD из «server-status» в формате JSON. Вы настраиваете его как
<Location "/md-status"> SetHandler md-status </Location>
на вашем сервере. Как и в случае с «server-status», вам необходимо добавить авторизацию для этого.
Если вы хотите проверить статус JSON конкретного домена, просто добавьте его к вашему URL статуса:
> curl https://<yourhost>/md-status/another-domain.org
{
"name": "another-domain.org",
"domains": [
"another-domain.org",
"www.another-domain.org"
],
... Этот JSON-статус также показывает журнал событий при продлении доменов:
{
"when": "Wed, 19 Jun 2019 14:45:58 GMT",
"type": "progress", "detail": "The certificate for the managed domain has been renewed successfully and can be used. A graceful server restart now is recommended."
},{
"when": "Wed, 19 Jun 2019 14:45:58 GMT",
"type": "progress", "detail": "Retrieving certificate chain for test-901-003-1560955549.org"
},{
"when": "Wed, 19 Jun 2019 14:45:58 GMT",
"type": "progress", "detail": "Waiting for finalized order to become valid"
},{
"when": "Wed, 19 Jun 2019 14:45:50 GMT",
"type": "progress", "detail": "Submitting CSR to CA for test-901-003-1560955549.org"
},
... Вы также найдете эту информацию в файле `job.json` в ваших папках подготовки и, при активации, доменов. Это позволит вам просмотреть эти данные в любое время в будущем.
Кроме того, есть MDCertificateStatus, который предоставляет доступ к соответствующей информации о сертификатах в формате JSON.
Stapling
Если вы хотите попробовать stapling для одного управляемого домена, настройка:
<MDomain mydomain.net> MDStapling on </MDomain>
и используйте «server-status» и/или MDMessageCmd для просмотра того, как оно работает. Вы увидите, есть ли там информация о Stapling, сколько она действительна, откуда она получена и когда она будет обновлена.
Если всё вас устраивает, вы можете включить его для всех сертификатов или только для управляемых.
Существующая реализация stapling в mod_ssl используется многими сайтами на протяжении многих лет. Основные различия между mod_ssl и mod_md:
- По требованию против запланированного: mod_ssl получает информацию о stapling при запросе, например, при новом подключении. mod_md получает её при старте сервера и после 2/3 его жизненного цикла.
- В памяти против сохранения: mod_ssl _может_ сохранить эту информацию, но большинство примеров конфигураций используют кэш в памяти. mod_md всегда сохраняет информацию в файловой системе.
Если вам не повезёт и вы перезапустите сервер во время перебоя в работе OCSP-сервиса вашего CA, ваши пользователи могут больше не получить доступ к вашим сайтам. Без сохранения ваша система не может предоставить клиенту данные, а браузер клиента не может их получить, так как OCSP-сервис не отвечает.
Реализация в mod_md сохранит её, загрузит снова после перезапуска и сделает доступной для входящих подключений. За день-два до истечения срока действия этой информации она будет обновлена, что позволит ей справиться с длительным простоями OCSP-сервиса.
Из-за обратной совместимости существующую реализацию в mod_ssl нельзя было существенно изменить. Например, mod_ssl не может добавить зависимость от mod_watchdog, не сломав многочисленные существующие установки (которые его не загружают).
Директива MDActivationDelay
| Описание: | |
|---|---|
| Синтаксис: | MDActivationDelay duration |
| Контекст: | конфигурация сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
| Совместимость: | Доступен в версии 2.4.42 и более поздних |
Директива MDBaseServer
| Описание: | Управление тем, может ли управляться базовый сервер или только виртуальные хосты. |
|---|---|
| Синтаксис: | MDBaseServer on|off |
| Значение по умолчанию: | MDBaseServer off |
| Контекст: | конфигурация сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
Управляет тем, должен ли базовый сервер (тот, что вне всех VirtualHost) управляться mod_md или нет. По умолчанию, это не так. По той причине, что это может иметь нежелательные побочные эффекты. Рекомендуется использовать виртуальные хосты для всех управляемых доменов и не полагаться на глобальную конфигурацию сервера по умолчанию.
Директива MDCAChallenges
| Описание: | Тип ACME-проверки, используемой для подтверждения владения доменом. |
|---|---|
| Синтаксис: | MDCAChallenges name [ name ... ] |
| Значение по умолчанию: | MDCAChallenges tls-alpn-01 http-01 dns-01 |
| Контекст: | конфигурация сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
Устанавливает типы проверок (в порядке приоритета) при подтверждении владения доменом. Поддерживаемые модулем типы проверок - `tls-alpn-01`, `dns-01` и `http-01`. Модуль будет анализировать общую конфигурацию сервера, чтобы определить, какие типы проверок могут быть использованы.
Например, если сервер работает на порте 80, доступен метод `http-01`. Предварительным условием для `dns-01` является настроенная команда MDChallengeDns01. `tls-alpn-01` описан выше в разделе «Проверки https:».
Эта автоматическая настройка работает для большинства конфигураций. Но поскольку Apache - это мощный сервер с множеством конфигурационных параметров, ситуация не ясна для всех возможных случаев. Например, он может работать на нескольких IP-адресах, некоторые из которых доступны по `https:`, а некоторые - нет.
Если вы настроите MDCAChallenges напрямую, эта автоматическая настройка отключается. Вместо этого модуль будет использовать настроенный список проверок при взаимодействии с сервером ACME (тип проверки также должен быть предложен сервером). Эти проверки анализируются в указанном порядке.
Директива MDCertificateAgreement
| Описание: | Вы подтверждаете, что приняли Условия предоставления услуг Уполномоченной организацией по сертификации. |
|---|---|
| Синтаксис: | MDCertificateAgreement accepted |
| Контекст: | настройка сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
При использовании mod_md для получения сертификата, вы становитесь клиентом Уполномоченной организации по сертификации (например, Let's Encrypt). Это означает, что вам необходимо прочитать и принять их Условия предоставления услуг, чтобы понять, что они предлагают и какие ограничения или требования могут быть наложены. mod_md сам по себе не может соглашаться на подобные вещи.
Директива MDCertificateAuthority
| Описание: | URL-адрес сервиса Уполномоченной организации по сертификации ACME. |
|---|---|
| Синтаксис: | MDCertificateAuthority url |
| По умолчанию: | MDCertificateAuthority https://acme-v02.api.letsencrypt.org/directory |
| Контекст: | настройка сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
URL-адрес, где Уполномоченная организация по сертификации предоставляет свои услуги.
В настоящее время Let's Encrypt предлагает четыре таких URL-адреса. Два для собственной устаревшей версии протокола ACME, обычно называемой ACMEv1. И два для версии RFC 8555, называемой ACMEv2.
Каждая версия имеет 2 конечные точки, так как есть одна для производства и одна для "этапа тестирования" для тестирования. Конечная точка тестирования работает так же, но не выдаст сертификаты, которые будут распознаны браузерами. Однако у неё также очень лояльные ограничения на скорость. Это позволяет многократно тестировать сервис, не блокируя себя.
Настройка этапа тестирования Let's Encrypt
MDCertificateAuthority https://acme-staging-v02.api.letsencrypt.org/directory
Директива MDCertificateCheck
| Описание: | |
|---|---|
| Синтаксис: | MDCertificateCheck name url |
| Контекст: | настройка сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
| Совместимость: | Доступна в версии 2.4.42 и более поздних |
Директива MDCertificateFile
| Описание: | Укажите статический файл сертификата для MD. |
|---|---|
| Синтаксис: | MDCertificateFile path-to-pem-file |
| Контекст: | настройка сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
Используется внутри MDomainSet и указывает на файл, содержащий цепочку сертификатов для Управляемого домена. Соответствующий ключ указывается через MDCertificateKeyFile.
Пример
<MDomain mydomain.com> MDCertificateFile /etc/ssl/my.cert MDCertificateKeyFile /etc/ssl/my.key </MDomain>
Это эквивалент директивы mod_ssl SSLCertificateFile. Она имеет несколько применений.
Например, при миграции существующего домена, использующего статические файлы, на автоматические сертификаты Let's Encrypt. Вы определяете MDomainSet, добавляете файлы сюда и удаляете SSLCertificateFile из ваших VirtualHosts.
Это даст вам то же самое, что и раньше, возможно с меньшим количеством повторяющихся строк в вашей конфигурации. Затем вы можете добавить MDRenewMode 'всегда' к нему, и модуль получит новый сертификат перед истечением срока действия сертификата из файла. После этого вы удаляете MDCertificateFile и перезагружаете сервер.
Еще один случай использования — продление сертификатов Let's Encrypt с помощью других клиентов ACME, например, отличного certbot. Затем позвольте вашим MD указывать на файлы из certbot и использовать их вместе.
Директива MDCertificateKeyFile
| Описание: | Укажите статический закрытый ключ для статического сертификата. |
|---|---|
| Синтаксис: | MDCertificateKeyFile path-to-file |
| Контекст: | настройка сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
Используется внутри MDomainSet и указывает на файл, содержащий закрытый ключ для Управляемого домена. Соответствующий сертификат указывается через MDCertificateFile.
Это эквивалент директивы mod_ssl SSLCertificateKeyFile.
Директива MDCertificateMonitor
| Описание: | URL-адрес монитора журнала сертификатов. |
|---|---|
| Синтаксис: | MDCertificateMonitor name url |
| По умолчанию: | MDCertificateMonitor crt.sh https://crt.sh?q= |
| Контекст: | настройка сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
Это часть HTML пользовательского интерфейса «серверный статус» и не имеет отношения к основному функционалу. Она определяет ссылку, предлагаемую на этой странице для простого просмотра монитора сертификатов. К сконфигурированному URL добавляется отпечаток SHA256 сертификата.
Мониторы сертификатов предлагают контроль над журналами прозрачности сертификатов (CT) для отслеживания использования сертификатов для доменов. Вы, как минимум, увидите, что Let's Encrypt (или любая другая вами сконфигурированная Уполномоченная организация по сертификации) внесла ваши сертификаты в журналы CT.
Предупреждение: журналы сертификатов обновляются, и мониторы принимают эти обновления с некоторой задержкой. Это варьируется в зависимости от журналов и мониторов. Новый сертификат не будет известен сразу.
Директива MDCertificateProtocol
| Описание: | Протокол, используемый с Уполномоченной организацией по сертификации. |
|---|---|
| Синтаксис: | MDCertificateProtocol protocol |
| По умолчанию: | MDCertificateProtocol ACME |
| Контекст: | настройка сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
Определяет используемый протокол. В настоящее время поддерживается только ACME.
Директива MDCertificateStatus
| Описание: | Отображает общедоступную информацию о сертификате в формате JSON. |
|---|---|
| Синтаксис: | MDCertificateStatus on|off |
| По умолчанию: | MDCertificateStatus on |
| Контекст: | настройка сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
При включении, в Управляемых доменах доступен ресурс по адресу 'https://domain/.httpd/certificate-status', который возвращает JSON-документ с ключами свойств текущего и обновлённого сертификатов — если они доступны.
Пример
{
"valid-until": "Thu, 29 Aug 2019 16:06:35 GMT",
"valid-from": "Fri, 31 May 2019 16:06:35 GMT",
"serial": "03039C464D454EDE79FCD2CAE859F668F269",
"sha256-fingerprint": "1ff3bfd2c7c199489ed04df6e29a9b4ea6c015fe8a1b0ce3deb88afc751e352d"
"renewal" : { ...renewed cert information... }
} Директива MDChallengeDns01
| Описание: | |
|---|---|
| Синтаксис: | MDChallengeDns01 path-to-command |
| Контекст: | настройка сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
Определяет программу, которая будет вызываться при необходимости настройки/удаления вызова `dns-01`. Программа получает аргумент `setup` или `teardown`, за которым следует имя домена. Для `setup` дополнительно передаётся содержимое вызова.
Вам не нужно указывать это, если возможен метод вызова `http:` или `https:`. Однако, Let's Encrypt делает `dns-01` единственным доступным вызовом для сертификатов с подстановочными знаками. Если вам необходим один из таких сертификатов, вам нужно настроить это.
Подробнее см. раздел о сертификатах с подстановочными знаками выше.
Директива MDContactEmail
| Описание: | |
|---|---|
| Синтаксис: | MDContactEmail address |
| Контекст: | настройка сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
Протокол ACME требует указать URL-адрес контакта при регистрации. В настоящее время Let's Encrypt хочет адрес электронной почты (и будет использовать его для уведомления о продлении или изменениях условий предоставления услуг). mod_md использует директиву MDContactEmail email в вашей конфигурации Apache, поэтому, пожалуйста, укажите правильный адрес там. Если MDContactEmail отсутствует, mod_md будет использовать директиву ServerAdmin.
Директива MDDriveMode
| Описание: | прежнее название MDRenewMode. |
|---|---|
| Синтаксис: | MDDriveMode always|auto|manual |
| По умолчанию: | MDDriveMode auto |
| Контекст: | настройка сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
Эта директива существует для обратной совместимости как старое название для MDRenewMode.
Директива MDExternalAccountBinding
| Описание: | |
|---|---|
| Синтаксис: | MDExternalAccountBinding key-id hmac-64 | none | file |
| По умолчанию: | MDExternalAccountBinding none |
| Контекст: | настройка сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
| Совместимость: | Доступна в версии 2.4.52 и более поздних |
Настройте значения для ACME «Связывания внешних учётных записей», функции стандарта ACME, которая позволяет клиентам привязывать регистрации к существующей учётной записи клиента на серверах ACME.
Let's Encrypt не требует этого, но другие Уполномоченные организации по сертификации ACME требуют. Проверьте у своей Уполномоченной организации по сертификации ACME, нужны ли вам эти значения и как их получить. Это две строки: идентификатор ключа и значение 'hmac' в кодировке base64.
Вы можете настроить их глобально или для конкретного MDomain. Поскольку эти значения позволяют любому регистрироваться под одной и той же учётной записью, рекомендуется ограничивать права доступа к файлу конфигурации, например, только для root.
Значение также может быть взято из JSON-файла, чтобы сохранить более открытые разрешения на конфигурацию сервера и ограничить разрешения на этот файл. Сам JSON выглядит так:
Пример JSON-файла EAB
{"kid": "kid-1", "hmac": "zWND..."} При изменении значений EAB новые значения будут использоваться при следующем обновлении сертификата.
Директива MDHttpProxy
| Описание: | Определите прокси-сервер для исходящих соединений. |
|---|---|
| Синтаксис: | MDHttpProxy url |
| Контекст: | настройка сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
Используйте http-прокси для подключения к MDCertificateAuthority. Определите его, если ваш веб-сервер может получить доступ к интернету только через прокси-сервер.
Директива MDMember
| Описание: | Дополнительное имя хоста для управляемого домена. |
|---|---|
| Синтаксис: | MDMember hostname |
| Контекст: | настройка сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
Вместо перечисления всех имён DNS в одной строке, вы можете использовать MDMember для добавления таких имён в управляемый домен.
Пример
<MDomain example.org>
MDMember www.example.org
MDMember mail.example.org
</MDomain> Если вы используете её в глобальном контексте, вне конкретного управляемого домена, вы можете указать только одно значение: 'auto' или 'manual', которое будет по умолчанию для всех других управляемых доменов. См. MDomain для описания этих специальных значений.
Директива MDMembers
| Описание: | Управление автоматическим добавлением псевдонимов доменных имён. |
|---|---|
| Синтаксис: | MDMembers auto|manual |
| Значение по умолчанию: | MDMembers auto |
| Контекст: | настройка сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
Определяет, будут ли ServerName и ServerAlias значения VirtualHost автоматически добавлены в члены Управляемого Домена или нет.
Директива MDMessageCmd
| Описание: | Обработка событий для Управляемых доменов |
|---|---|
| Синтаксис: | MDMessageCmd path-to-cmd optional-args |
| Контекст: | настройка сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
Эта команда вызывается при наступлении одного из следующих событий для управляемого домена: "обновлен", "установлен", "выходит из строя", "ошибка". В будущем могут быть вызваны и другие события, и команда будет игнорировать события, с которыми она не может справиться.
Это более гибкий аналог MDNotifyCmd.
Пример
MDMessageCmd /etc/apache/md-message
# will be invoked when a new certificate for mydomain.org is available as: /etc/apache/md-message renewed mydomain.com
Программа не должна блокироваться, так как модуль будет ожидать её завершения. Код возврата, отличный от 0, считается ошибкой.
Событие "ошибка" не является поводом для немедленного беспокойства, так как попытка обновления выполняется достаточно рано, чтобы позволить возобновить работу интернета. Оно сообщается не чаще, чем один раз в час.
Событие "выходит из строя" должно рассматриваться серьёзно. Оно генерируется, когда достигается MDWarnWindow. По умолчанию это составляет 10% от срока действия сертификата, поэтому для Let's Encrypt это сейчас означает 9 дней до истечения срока действия. Предупреждение повторяется не чаще, чем один раз в день.
Событие "обновлён" означает, что новый сертификат получен и сохранён в области "подготовка" в хранилище управляемого домена. Он будет активирован при следующей перезагрузке/перезапуске сервера.
Событие "установлен" срабатывает, когда новый сертификат был перенесён из области "подготовка" в место расположения домена в хранилище управляемого домена. Это происходит при запуске/перезагрузке сервера. В отличие от всех других вызовов, MDMessageCmd выполняется с правами root (в *nix системах) и имеет доступ к файлам сертификатов (и ключам). Сертификаты, необходимые для других приложений или в других форматах, могут быть обработаны на этом событии.
Событие "обновление" срабатывает перед запуском процесса обновления для управляемого домена. Если команда вернёт значение != 0 по этой причине, обновление будет прервано и повторено в следующем цикле. Некоторые конфигурации кластеров используют это, чтобы позволить обновлениям выполняться только на одном узле.
Событие "установка-вызова:тип:домен" срабатывает, когда данные проверки для домена были созданы. Этот вызов выполняется перед тем, как сервер ACME попросит проверить их. Тип — один из типов проверок ACME. Этот вызов выполняется для каждого имени DNS в управляемом домене. Конфигурации кластеров могут использовать это событие для распределения файлов проверок по всем узлам кластера.
ocsp-ошибка происходит, когда MDStapling включён для домена, это указывает на то, что возникла ошибка при получении ответа OCSP от центра сертификации. mod_md будет продолжать попытки.
Директива MDMustStaple
| Описание: | Управление тем, содержат ли новые сертификаты флаг OCSP Must Staple. |
|---|---|
| Синтаксис: | MDMustStaple on|off |
| Значение по умолчанию: | MDMustStaple off |
| Контекст: | настройка сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
Определяет, должен ли запрашиваемый сертификат содержать флаг OCSP Must Staple или нет. Если сертификат имеет этот флаг, сервер обязан отправлять ответ OCSP stapling каждому клиенту. Это работает только если вы настроили mod_ssl для генерации этого (см. SSLUseStapling и аналогичные).
Директива MDNotifyCmd
| Описание: | Запуск программы при готовности управляемого домена. |
|---|---|
| Синтаксис: | MDNotifyCmd path [ args ] |
| Контекст: | настройка сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
Настроенное исполняемое приложение запускается, когда управляемый домен зарегистрировался или обновил свой сертификат. Ему передаётся имя обработанного управляемого домена в качестве дополнительных аргументов (после параметров, указанных здесь). Оно должно возвращать код состояния 0, чтобы указать на успешное выполнение.
Директива MDomain
| Описание: | Определение списка доменных имён, принадлежащих одной группе. |
|---|---|
| Синтаксис: | MDomain dns-name [ other-dns-name... ] [auto|manual] |
| Контекст: | настройка сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
Все имена в списке управляются как один управляемый домен (MD). mod_md запросит один сертификат, действительный для всех этих имён. Эта директива использует глобальные настройки (см. другие директивы MD ниже). Если вам нужны специфические настройки для одного MD, используйте <MDomainSet>.
Для управляемого домена необходимы ещё 2 настройки: адрес электронной почты для связи (через MDContactEmail или ServerAdmin) и MDCertificateAgreement. Адрес электронной почты ServerAdmin используется для регистрации в ЦС (по умолчанию Let's Encrypt). ЦС может использовать его для уведомлений о изменениях в своих услугах или статусе ваших сертификатов.
Вторая настройка, MDCertificateAgreement, должна иметь значение "принято". Указав это, вы подтверждаете, что принимаете условия обслуживания ЦС.
Пример
MDContactEmail admin@example.org
MDCertificateAgreement accepted
MDomain example.org www.example.org
<VirtualHost *:443>
ServerName example.org
DocumentRoot htdocs/root
SSLEngine on
</VirtualHost>
<VirtualHost *:443>
ServerName www.example.org
DocumentRoot htdocs/www
SSLEngine on
</VirtualHost> В этой директиве можно использовать два специальных имени: 'manual' и 'auto'. Это определяет, должен ли управляемый домен иметь точно тот же список имён, что и в конфигурации ('manual'), или предложить больше удобства. С 'auto' все имена виртуального хоста добавляются в MD. Удобно, что 'auto' также является значением по умолчанию.
Пример
MDomain example.org
<VirtualHost *:443>
ServerName example.org
ServerAlias www.example.org
DocumentRoot htdocs/root
SSLEngine on
</VirtualHost>
MDomain example2.org auto
<VirtualHost *:443>
ServerName example2.org
ServerAlias www.example2.org
...
</VirtualHost> В этом примере домен 'www.example.org' автоматически добавляется в MD 'example.org'. Аналогично для 'example2.org', где 'auto' указано явно. При добавлении новых имён ServerAlias в этот виртуальный хост, они также будут добавлены в управляемый домен.
Если вы предпочитаете явно указывать все доменные имена, используйте режим 'manual'. Будет записана ошибка, если имена не совпадают с ожидаемыми.
<MDomainSet> Директива
| Описание: | Контейнер для директив, применяемых к одним и тем же управляемым доменам. |
|---|---|
| Синтаксис: | <MDomainSet dns-name [ other-dns-name... ]>...</MDomainSet> |
| Контекст: | настройка сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
Это директива MDomain с добавлением возможности добавления настроек только для этого управляемого домена. Фактически, вы можете использовать "<MDomain ..>" как сокращение.
Это позволяет настроить управляемый домен, который использует другой центр сертификации, имеет другие требования к обновлению и т.д.
Пример
<MDomain sandbox.example.org>
MDCertificateAuthority https://someotherca.com/ACME
</MDomain> Распространённый случай использования — настройка требований https для ваших доменов отдельно.
Пример
<MDomain example.org>
MDRequireHttps temporary
</MDomain> Директива MDPortMap
| Описание: | Сопоставление внешних и внутренних портов для проверки владения доменом. |
|---|---|
| Синтаксис: | MDPortMap map1 [ map2 ] |
| Значение по умолчанию: | MDPortMap http:80 https:443 |
| Контекст: | настройка сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
Протокол ACME предлагает два метода проверки владения доменом через HTTP: один использующий URL 'http:' (порт 80) и один для 'https:' URL (порт 443). Если ваш сервер недоступен по хотя бы одному из двух, ACME может работать только с настройкой вашего DNS-сервера, см. MDChallengeDns01.
На большинстве публичных серверов 'http:' приходит на порт 80, а 'https:' на порт 443. Модуль проверяет порты, на которых работает ваш Apache сервер, и предполагает, что они доступны. Это означает, что если ваш сервер не работает на порту 80, он предполагает, что запросы 'http:' из интернета не будут работать.
Это предположение, и оно может быть неверным. Например, ваш Apache может работать на порту 80, но ваш брандмауэр может его блокировать. 'http:' доступен только в вашей внутренней сети. Таким образом, модуль ошибочно предположит, что Let's Encrypt может использовать 'http:'-вызовы с вашим сервером. Это затем провалится, потому что ваш брандмауэр будет отбрасывать эти запросы.
Пример
MDPortMap http:- https:8433
Приведенный выше пример показывает, как можно указать, что запросы 'http:' из интернета никогда не придут. Кроме того, он указывает, что запросы 'https:' придут на локальный порт 8433.
Это необходимо, если у вас есть переадресация портов, ваш сервер может быть доступен из интернета на порту 443, но локальный порт, который использует httpd, другой. Ваш сервер может работать только на портах 8443 и 8000, но быть доступным по портам 443 и 80 (из интернета).
Направление MDPrivateKeys
| Описание: | Устанавливает тип и размер генерируемых закрытых ключей. |
|---|---|
| Синтаксис: | MDPrivateKeys type [ params... ] |
| По умолчанию: | MDPrivateKeys RSA 2048 |
| Контекст: | настройки сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
Определяет тип генерируемых закрытых ключей для управляемого домена и параметры. Можно настроить несколько типов закрытых ключей, и модуль получит сертификат для каждого ключа.
Например, можно настроить ключи RSA и Эллиптической кривой (EC), чтобы для домена были созданы 2 сертификата. При подключении клиента будет использован первый поддерживаемый клиентом тип ключа.
Поскольку ключи EC и сертификаты меньше, их можно предлагать в первую очередь для всех совместимых (современных) клиентов. Это может ускорить установление соединения. Добавьте тип ключа RSA для поддержки более старых клиентов.
Пример
MDPrivateKeys secp256r1 rsa3072
Поддерживаемые типы EC зависят от используемого CA. Для Let's Encrypt поддерживаемые кривые включают 'secp256r1' и 'secp384r1'.
Каждый тип ключа и сертификата хранится в отдельном файле в хранилище MD. Тип ключа является частью имени файла с некоторыми обратной совместимыми именами для сертификатов RSA. Таким образом, вы можете продолжать обмениваться этими файлами с другими приложениями.
Обратите внимание, что это настройка влияет только на новые ключи. Любой существующий закрытый ключ остается без изменений. Кроме того, это влияет только на закрытые ключи, сгенерированные для сертификатов. Ключи учетных записей ACME не затрагиваются.
Направление MDRenewMode
| Описание: | Управляет обновлением сертификатов. |
|---|---|
| Синтаксис: | MDRenewMode always|auto|manual |
| По умолчанию: | MDRenewMode auto |
| Контекст: | настройки сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
В режиме по умолчанию ('auto'), модуль выполнит действия, которые наиболее логичны для каждого управляемого домена. Для домена без сертификатов он получит их от центра сертификации.
Однако, если вы определили управляемый домен, который не используется ни одним из виртуальных хостов Apache, он не будет предпринимать действий. Для управляемых доменов со статическими файлами сертификатов (см. MDCertificateFile) он предполагает, что у вас есть собственный источник, и не будет их обновлять.
Вы можете переопределить это значение. Если вы укажете 'always', модуль обновит сертификаты для управляемого домена независимо от использования доменов или наличия статических файлов.
Для противоположного эффекта настройте 'manual', и попытка обновления не будет выполнена.
Направление MDRenewWindow
| Описание: | Управляет временем обновления сертификата. |
|---|---|
| Синтаксис: | MDRenewWindow duration |
| По умолчанию: | MDRenewWindow 33% |
| Контекст: | настройки сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
Если срок действия сертификата опустится ниже заданного значения, mod_md получит новый подписанный сертификат.
Обычно сертификаты действительны около 90 дней, и mod_md обновит их за 33% до окончания срока действия (например, для 90-дневного сертификата - за 30 дней до истечения срока действия). Если вы считаете, что это не то, что вам нужно, вы можете указать точное время, как в примере:
Пример
# 21 days before expiry MDRenewWindow 21d # 30 seconds (might be close) MDRenewWindow 30s # 10% of the cert lifetime MDRenewWindow 10%
В режиме автоматического обновления модуль проверяет состояние управляемых доменов каждые 12 часов и, при необходимости, выполняет действия. При ошибках (например, недоступность CA) он первоначально повторно пытается подключиться через несколько секунд. Если попытки будут неудачными, интервал проверок будет увеличен до 1 часа.
Направление MDRequireHttps
| Описание: | Перенаправляет трафик http: на https: для управляемых доменов. |
|---|---|
| Синтаксис: | MDRequireHttps off|temporary|permanent |
| По умолчанию: | MDRequireHttps off |
| Контекст: | настройки сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
Это удобное направление для упрощения миграции управляемых доменов с http: на https:. С помощью:
Пример
MDRequireHttps temporary
вы объявляете о желании перенаправлять весь трафик по http: URL на https: URL на текущий момент. Это безопасно, и вы можете удалить это направление в любое время.
Следующее имеет последствия: если вы хотите, чтобы клиенты больше не использовали http: URL, настройте:
Постоянно (как минимум на полгода!)
MDRequireHttps permanent
Это делает два вещи:
- Все запросы к ресурсам
http:перенаправляются на тот же URL с использованием схемыhttps:и кодом состояния301. Это сообщает клиентам, что это постоянное изменение, и они должны соответствующим образом обновить все ссылки. - Все ответы на запросы
https:будут содержать заголовокStrict-Transport-Securityс сроком действия полгода. Это сообщает браузеру, что он никогда (в течение полугода) не должен использоватьhttp:при работе с этим доменным именем. После этого браузеры откажутся от связи с вашим незашифрованным сайтом. Это предотвращает злоумышленным программам-посредникам от понижения уровня шифрования соединения и перехвата/манипулирования трафиком. Что хорошо. Но вы не можете просто отменить это изменение.
Вы можете добиться того же с помощью mod_alias и некоторых настроек Redirect, по сути. Если вы делаете это самостоятельно, убедитесь, что исключаете пути /.well-known/* из перенаправления, иначе mod_md может столкнуться с проблемами при подписи новых сертификатов.
Если вы устанавливаете это значение глобально, оно применяется ко всем управляемым доменам. Если вам нужно только для определенного домена, используйте:
Пример
<MDomain xxx.yyy> MDRequireHttps temporary </MDomain>
Направление MDServerStatus
| Описание: | Управляет добавлением информации о управляемых доменах в server-status. |
|---|---|
| Синтаксис: | MDServerStatus on|off |
| По умолчанию: | MDServerStatus on |
| Контекст: | настройки сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
Обработчик Apache 'server-status' позволяет настроить ресурс для мониторинга происходящего. Теперь он включает раздел со списком всех управляемых доменов с DNS-именами, статусом обновления, сроками действия и основными свойствами.
Вы можете отключить его с помощью этого направления.
Направление MDStapleOthers
| Описание: | Включить stapling для сертификатов, не управляемых mod_md. |
|---|---|
| Синтаксис: | MDStapleOthers on|off |
| По умолчанию: | MDStapleOthers on |
| Контекст: | настройки сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
| Совместимость: | Доступно в версии 2.4.42 и более поздних |
Это значение имеет эффект только при включенном MDStapling. Оно управляет тем, должен ли mod_md также предоставлять информацию о стаплинге для сертификатов, которые не управляются им напрямую, например, обновленных через ACME CA.
Направление MDStapling
| Описание: | Включить stapling для всех или для конкретного MDomain. |
|---|---|
| Синтаксис: | MDStapling on|off |
| По умолчанию: | MDStapling off |
| Контекст: | настройки сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
| Совместимость: | Доступно в версии 2.4.42 и более поздних |
mod_md предлагает реализацию для предоставления информации о OCSP stapling. Это альтернатива, предоставляемой mod_ssl. Для обеспечения обратной совместимости, она отключена по умолчанию.
Стаплинга можно включить для всех сертификатов на сервере или для отдельного MDomain. Это заменит любую конфигурацию стаплинга в mod_ssl для этих хостов. Когда отключено, работа будет выполняться стаплингом mod_ssl (если он сам включен, конечно). Это позволяет постепенный переход от одной реализации к другой.
Стаплинга mod_md также будет работать для доменов, где сертификаты не управляются этим модулем (см. MDStapleOthers для управления этим). Это позволяет использовать новый стаплинга без использования управления сертификатами ACME.
Направление MDStaplingKeepResponse
| Описание: | Управляет удалением старых ответов. |
|---|---|
| Синтаксис: | MDStaplingKeepResponse duration |
| По умолчанию: | MDStaplingKeepResponse 7d |
| Контекст: | настройки сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
| Совместимость: | Доступно в версии 2.4.42 и более поздних |
Этот временной интервал задаёт, когда данные ответов OCSP, используемые в стаплинге, должны быть удалены из хранилища. Данные ответов, старше 7 дней (по умолчанию), удаляются при перезапуске/перезагрузке сервера. Это предотвращает рост хранилища при частых обновлениях/переконфигурациях сертификатов.
Директива MDStaplingRenewWindow
| Описание: | Управление временем обновления ответов стапля. |
|---|---|
| Синтаксис: | MDStaplingRenewWindow duration |
| По умолчанию: | MDStaplingRenewWindow 33% |
| Контекст: | конфигурация сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
| Совместимость: | Доступно в версии 2.4.42 и более поздних |
Если срок действия ответа OCSP, используемого для стапля, падает ниже duration, mod_md получит новый ответ OCSP.
Сертификационный центр, выдающий сертификат, обычно также управляет службой ответа OCSP и определяет, как долго его подписанные ответы о валидности сертификата остаются действительными. Чем дольше срок действия ответа, тем дольше его можно кэшировать, что приводит к лучшей общей производительности для всех. Чем короче срок действия, тем быстрее сведения о выводе сертификатов распространяются среди клиентов. Кроме того, учитывается надежность службы.
Регулируя окно обновления стапля, вы можете контролировать части этого самостоятельно. Если вы уменьшите время обновления (например, за короткий промежуток времени до истечения текущей информации), вы получите максимальное время кэширования. Но выход из строя службы (например, на техническое обслуживание) повлияет на вас. Если вы обновите за долгое время до истечения срока действия, обновления будут выполняться чаще, что создаст большую нагрузку на инфраструктуру сервера CA, а также большую координацию между дочерними процессами вашего сервера.
По умолчанию выбрано значение 33%, что означает, что обновление запускается, когда остается только треть срока действия ответа. Для CA, которая выдает ответы OCSP со сроком действия 3 дня, это означает 2 дня кэширования и 1 день для попыток обновления. Выход из строя службы должен длиться полные 24 часа, чтобы повлиять на ваши домены.
Также возможно установить абсолютное окно обновления, например, `2d` (2 дня).
Директива MDStoreDir
| Описание: | Путь на локальной файловой системе для хранения данных управляемых доменов. |
|---|---|
| Синтаксис: | MDStoreDir path |
| По умолчанию: | MDStoreDir md |
| Контекст: | конфигурация сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
Определяет, где на локальной файловой системе хранятся данные управляемого домена. Это абсолютный путь или интерпретируется относительно корня сервера. По умолчанию будет создана директория 'md' в корне вашего сервера.
Если вы перемещаете этот путь и у вас уже есть данные, обязательно сначала переместите/скопируйте данные в новое место, переконфигурируйте и перезапустите сервер. Если вы переконфигурируете и перезапустите сервер в первую очередь, сервер попытается получить новые сертификаты, которые, как он считает, отсутствуют.
Директива MDWarnWindow
| Описание: | Определение временного окна, когда вы хотите получать предупреждения об истекающем сертификате. |
|---|---|
| Синтаксис: | MDWarnWindow duration |
| По умолчанию: | MDWarnWindow 10% |
| Контекст: | конфигурация сервера |
| Статус: | Экспериментальный |
| Модуль: | mod_md |
См. MDRenewWindow для описания способов указания времени.
Модуль проверяет оставшийся срок действия сертификатов и вызывает MDMessageCmd , когда осталось меньше, чем окно предупреждения. По умолчанию это означает 9 дней для сертификатов от Let's Encrypt.
Это также относится к управляемым доменам со статическими файлами сертификатов (см. MDCertificateFile).
© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/mod/mod_md.html