Работа с сертификатами Let's Encrypt
Информация на этой странице находится в доработке. Информация может добавляться и изменяться.
Рассматриваем работу с сертификатами Let’s Encrypt при помощи утилиты #LeGo.
Установка LeGo
- Скачать #LeGo и распаковать в директорию
/root/apps/acme/
. - Установить файл
app.hook.sh
в директорию/root/apps/acme/
. - Изучить документацию и справку по командам для составления запросов на получение и обновление сертификатов.
- Выбрать метод получения и обновления сертификатов.
Метод HTTP-01
Let’s Encrypt выдаёт клиенту токен, клиент записывает этот токен в файл на web-сервере по пути http://example.org/.well-known/acme-challenge/<TOKEN>
.
Плюсы метода:
- Легко автоматизировать без дополнительных знаний о домене.
- Работает со всеми web-серверами.
- Можно использовать для проверки IP-адресов.
Минусы метода:
- Не работает, если провайдер блокирует порт
80
. - Не позволяет получать wildcard-сертификаты.
Получение сертификата
- Зарегистрировать адрес
mail@example.org
и получить сертификат с типом ключаec256
для доменовexample.org
иmail.example.org
в директорию/root/apps/acme/
:
- Зарегистрировать адрес
mail@example.org
и получить сертификат с типом ключаrsa4096
для доменовexample.org
иmail.example.org
в директорию/root/apps/acme/
:
Параметры
--accept-tos
- автоматически принять соглашение.--path
- путь к хранилищу сертификатов (/root/apps/acme/
).--email
- адрес электронной почты для регистрации и восстановления сертификата Let’s Encrypt (mail@example.org
).--domains
- список доменов для получения сертификата (example.org
иmail.example.co
).--http
- получение сертификата методомHTTP-01
.--http.port
- порт8080
, на котором работает LeGo. Angie из статьи Angie: Установка и настройка перебрасывает запросы к.well-known/acme-challenge
на порт8080
.
Обновление сертификата
- Обновить сертификат с типом ключа
ec256
для доменовexample.org
иmail.example.org
в директории/root/apps/acme/
и запустить файлhook.sh
при успешном обновлении:
- Обновить сертификат с типом ключа
rsa4096
для доменовexample.org
иmail.example.org
в директории/root/apps/acme/
и запустить файлhook.sh
при успешном обновлении:
Параметры
--renew-hook
- выполнение специального скрипта только после успешного обновления сертификата.
Задание
- Создать файл
/etc/cron.d/app_acme_example_com
со следующим содержанием:
|
|
Метод DNS-01
Let’s Encrypt проверяет принадлежность домена клиенту при помощи специальной TXT-записи _acme-challenge.example.org
для доменного имени.
Плюсы метода:
- Позволяет получать wildcard-сертификаты.
- Работает со множеством серверов.
Минусы метода:
- Необходимо хранить данные API от DNS-провайдера на сервере.
- DNS-провайдер может не предоставлять специальный API для изменения записей домена.
- Нельзя использовать для проверки IP-адресов.
Получение сертификата
- Зарегистрировать адрес
mail@example.org
и получить сертификат с типом ключаec256
для доменовexample.org
и*.example.org
в директорию/root/apps/acme/
:
|
|
- Зарегистрировать адрес
mail@example.org
и получить сертификат с типом ключаrsa4096
для доменовexample.org
и*.example.org
в директорию/root/apps/acme/
:
|
|
Параметры
CF_DNS_API_TOKEN
- токен доступа #LeGo к редактированию зоныexample.org
.--accept-tos
- автоматически принять соглашение.--path
- путь к хранилищу сертификатов (/root/apps/acme
).--email
- адрес электронной почты для регистрации и восстановления сертификата Let’s Encrypt (mail@example.org
).--domains
- список доменов для получения сертификата (example.org
и*.example.org
).--dns
- получение сертификата методомDNS-01
.--dns.resolvers
- список внешних серверов DNS для доменных имён.
Обновление сертификата
- Обновить сертификат с типом ключа
ec256
для доменовexample.org
и*.example.org
в директории/root/apps/acme/
и запустить файлhook.sh
при успешном обновлении:
|
|
- Обновить сертификат с типом ключа
rsa4096
для доменовexample.org
и*.example.org
в директории/root/apps/acme/
и запустить файлhook.sh
при успешном обновлении:
|
|
Параметры
--renew-hook
- выполнение специального скрипта только после успешного обновления сертификата.
Задание
- Создать файл
/etc/cron.d/app_acme_example_com
со следующим содержанием:
|
|
Метод TLS-ALPN-01
Проверка TLS-ALPN-01 выполняется через TLS handshake на порте 443
. Применяется специальный протокол ALPN
, чтобы на запросы валидации отвечали только серверы, знающие о таком типе проверки. Присутствует возможность использовать поле SNI
, совпадающее с именем домена, для которого проводится валидация, для увеличения надёжности проверки.
Плюсы метода:
- Работает при закрытом порте
80
. - Проверка выполняется исключительно на уровне TLS.
- Можно использовать для проверки IP-адресов.
Минусы метода:
- Возможно, какие-то web-серверы не поддерживают данный метод проверки.
- Не позволяет получать wildcard-сертификаты.
Настройка Angie
К сожалению, метод проверки требует не занятого порта 443
. Если какой то сервис уже занимает порт 443
, то этот сервис на время проверки необходимо выключить. Чтобы обойти данное ограничение, можно до-настроить Angie таким образом, чтобы он перенаправлял соединения TLS-ALPN
на сервис проверки сертификатов, а остальные соединения направлял на виртуальные хосты HTTPS.
- На всех виртуальных хостах изменить порт
443
на8443
. - Создать балансировщик нагрузки
ALPN
, добавив в файл/etc/angie/angie.conf
следующую конфигурацию:
|
|
Получение сертификата
- Зарегистрировать адрес
mail@example.org
и получить сертификат с типом ключаec256
для доменовexample.org
иmail.example.org
в директорию/root/apps/acme/
:
- Зарегистрировать адрес
mail@example.org
и получить сертификат с типом ключаrsa4096
для доменовexample.org
иmail.example.org
в директорию/root/apps/acme/
:
Параметры
--accept-tos
- автоматически принять соглашение.--path
- путь к хранилищу сертификатов (/root/apps/acme/
).--email
- адрес электронной почты для регистрации и восстановления сертификата Let’s Encrypt (mail@example.org
).--domains
- список доменов для получения сертификата (example.org
иmail.example.co
).--tls
- получение сертификата методомTLS-ALPN-01
.--tls.port
- номер порта для работы #LeGo (10443
).
Обновление сертификата
- Обновить сертификат с типом ключа
ec256
для доменовexample.org
иmail.example.org
в директории/root/apps/acme/
и запустить файлhook.sh
при успешном обновлении:
- Обновить сертификат с типом ключа
rsa4096
для доменовexample.org
иmail.example.org
в директории/root/apps/acme/
и запустить файлhook.sh
при успешном обновлении:
Параметры
--renew-hook
- выполнение специального скрипта только после успешного обновления сертификата.
Задание
- Создать файл
/etc/cron.d/app_acme_example_com
со следующим содержанием:
|
|
Hook
Я написал специальный hook, который должен выполняться при успешном получении сертификата. В основном, работа hook’а заключается в том, чтобы перемещать файлы сертификатов необходимые директории и перезапускать сервисы.
Установка
- Сохранить файлы
app.hook.conf
иapp.hook.sh
в директорию/root/apps/acme/
.
Конфигурация приложений
В этом разделе представлены настройки использования сертификата Let’s Encrypt для различных приложений.
Postfix
- Настроить параметры в
/etc/postfix/main.cf
для доменаexample.org
:
|
|
- Настроить параметры в
/etc/postfix/main.cf
для доменаexample.org
с использованием сертификатов с несколькими шифрами:
|
|
Dovecot
- Настроить параметры в
/etc/dovecot/dovecot.conf
для доменаexample.org
:
|
|
MariaDB
- Настроить параметры в
/etc/mysql/my.cnf
для доменаexample.org
:
|
|
OpenLDAP
- Настроить параметры в
/etc/ldap/slapd.conf
для доменаexample.org
:
|
|
Скрипт
Скрипт состоит из следующих компонентов:
app.acme.conf
- файл с общими настройками.app.acme.sh
- приложение ACME.app.hook.conf
- файл с настройками hook’а.app.hook.sh
- приложение hook’а.job.acme
- задание для CRON.example.org_dns
- пример конфигурации доменаexample.org
для метода DNS-01.example.org_http
- пример конфигурации доменаexample.org
для метода HTTP-01.
Установка
- Скачать и установить скрипт:
Настройка
Параметры скрипта переопределяемые. Переопределение идёт в такой последовательности:
- Общие параметры скрипта (
app_acme.conf
).- Параметры домена (
example.org
).
- Параметры домена (
Общие параметры скрипта можно переопределить параметрами домена.
Общие параметры
Общие параметры для выполнения скрипта.
SERVER
- сервер запроса сертификата ACME.RESOLVERS
- DNS-серверы для разрешения CNAME и определения основного домена. При проверке методом DNS-01 запрос направляется на авторитарный DNS-сервер. Синтаксис:HOST:PORT
. По умолчанию используются публичные DNS-серверы.DNS
- DNS-провайдер домена для получения сертификата методом DNS-01.PFX_PASS
- пароль для сертификата формата PFX. По умолчанию:changeit
.PFX_FORMAT
- формат кодирования для шифрования файла.pfx
. По умолчанию:RC2
.RC2
- формат кодированияRC2
.DES
- формат кодированияDES
.SHA256
- формат кодированияSHA256
.
PORT
- порт или интерфейс, который будет прослушиваться при получении сертификата методом HTTP-01. По умолчанию::8080
.DAYS
- количество дней, оставшихся до истечения срока действия сертификата, необходимого для его продления. По умолчанию:30
.PROXY_HEADER
- выполнять проверку по указанному заголовку HTTP при заказе сертификата методом HTTP-01 за обратным PROXY-сервером. По умолчанию:Host
.HTTP_TIMEOUT
- значение тайм-аута HTTP в секундах. По умолчанию:0
.DNS_TIMEOUT
- значение тайм-аута DNS в секундах. Используется только при авторитарных запросов к DNS-серверу. По умолчанию:10
.CERT_TIMEOUT
- значение тайм-аута сертификата в секундах. Используется только при получении сертификатов. По умолчанию:30
.REQUEST_LIMIT
- общий лимит запросов ACME. По умолчанию:18
.USER_AGENT
- user-agent для идентификации запросов от приложения, отправляемых в CA. По умолчанию:ACME-LEGO/DOMAIN_FILE
.
Параметры домена
Параметры для конфигурации домена.
DOMAINS
- массив домена и его суб-доменов.EMAIL
- email для регистрации на сервере ACME.TYPE
- тип проверки.dns
- тип проверки DNS-01.http
- тип проверки HTTP-01.
Параметры hook’а
Параметры для выполнения hook’а при получении или обновлении сертификата.
DATA
- директория для хранения сертификатов.SERVICES
- массив сервисов, которым необходимо дать задание на перечитывание конфигурации при обновлении сертификата.
Синтаксис
Скрипт принимает параметры в следующей очередности:
DOMAIN_FILE
- файл с конфигурацией домена. Желательно название файла указывать согласно имени домена.KEY
- тип ключа сертификата.rsa2048
- тип ключаRSA2048
rsa3072
- тип ключаRSA3072
rsa4096
- тип ключаRSA4096
rsa8192
- тип ключаRSA8192
ec256
- тип ключаEC256
ec384
- тип ключаEC384
ACTION
- действие скрипта.run
- получить новый сертификат для домена.renew
- запросить обновление сертификата для домена.
Примеры
- Запустить получение сертификата ACME с типом ключа
rsa4096
для доменаexample.org
(файл конфигурации имеет названиеexample.org
):
- Запустить получение сертификата ACME с типом ключа
ec256
для доменаexample.org
(файл конфигурации имеет названиеexample.org
):
- Запустить обновление сертификата ACME с типом ключа
ec256
для доменаexample.org
(файл конфигурации имеет названиеexample.org
):
Задание
Задание запускает скрипт каждый день в 03:35
и 04:35
для типа ключа RSA4096
и EC256
, соответственно.