Как запросить сертификат LetsEncrypt с помощью Acme
LetsEncrypt изменил мир SSL-сертификатов, когда его предложение бесплатных недолговечных SSL-сертификатов позволило огромному количеству людей и компаний бесплатно защитить свои веб-приложения. С этой службой должна была существовать необходимая инфраструктура, и с этой целью возникло множество приложений, которые соответствовали потребностям выдачи SSL.
Одной из наиболее распространенных утилит является утилита CertBot
, которая может работать хорошо, но есть еще одно доступное приложение с открытым исходным кодом — acme.sh
. Это полностью основанный на оболочке клиент ACME (протокол, используемый LetsEncrypt для выдачи SSL-сертификатов). Благодаря большому количеству встроенных расширенных функций этот клиент позволяет создавать сложные конфигурации.
Установка Acme.sh
Самый простой способ установить [acme.sh](
— это следующий, который загружает и выполняет скрипт отсюда, https://raw. githubusercontent.com/acmesh-official/acme.sh/master/acme.sh
.
curl <https://get.acme.sh> | sh
Исходный код этого сайта находится здесь, если вы хотите проверить, что делает настоящий скрипт.
Программа установки загрузит и переместит файлы в ~/.acme.sh
и установит псевдоним в ваш файл ~/.bashrc
. Кроме того, задание cron будет установлено, если оно доступно.
Первые шаги
То, как вы используете [acme.sh](
, во многом зависит от метода и приложения, для которого вы запрашиваете сертификат. Acme.sh предлагает множество различных способов запроса сертификата, например:
- Режим веб-рута
- Автономный режим
- Автономный режим tls-alpn
- Режим Apache
- Режим Nginx
- Режим DNS
- Режим псевдонима DNS
- Режим без сохранения состояния
В этой статье я собираюсь продемонстрировать два разных способа запроса сертификата. Я включаю конфигурации веб-серверов как для NGINX, так и для Apache, которые используют метод Webroot. Метод режима DNS использует файл конфигурации для создания записей CNAME, которые используются для проверки домена, вместо создания файла в файловой системе.
Конфигурация веб-сервера
Конфигурация NGINX LetsEncrypt
NGINX упрощает создание общей конфигурации для использования при использовании метода webroot
для запроса сертификата.
letsencrypt.conf
Рекомендуется создать автономную конфигурацию, которую при необходимости можно включить в конфигурации виртуального хоста, например: include /etc/nginx/letsencrypt.conf
# Rule for legitimate ACME Challenge requests (like /.well-known/acme-challenge/xxxxxxxxx)
# We use ^~ here, so that we don't check other regexes (for speed-up). We actually MUST cancel
# other regex checks, because in our other config files have regex rule that denies access to files with dotted names.
location ^~ /.well-known/acme-challenge/ {
# Set correct content type. According to this:
# <https://community.letsencrypt.org/t/using-the-webroot-domain-verification-method/1445/29>
# Current specification requires "text/plain" or no content header at all.
# It seems that "text/plain" is a safe option.
default_type "text/plain";
}
# Direct access returns a 404
location = /.well-known/acme-challenge/ {
return 404;
}
Апачи
Как и NGINX, Apache может создать отдельный файл конфигурации. Пример такой конфигурации показан ниже.
/etc/apache2/conf-available/letsencrypt.conf
В этом случае конфигурация Apache специфична для виртуального хоста из-за необходимости включать расположение на диске. Ниже приведено обычное расположение, но оно может отличаться в зависимости от конкретной конфигурации.
Alias /.well-known/acme-challenge/ "/var/www/html/.well-known/acme-challenge/"
<Directory "/var/www/html/">
AllowOverride None
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
Require method GET POST OPTIONS
</Directory>
Конфигурация DNS
В этой статье я демонстрирую режим DNS с помощью Cloudflare, так как он предлагает чрезвычайно быстрые изменения DNS и исключительно хорошо работает с этим методом.
Acme.sh использует две переменные среды для метода dns_cf
: CF_Key
и CF_Email
. Чтобы включить это в свою среду при запуске, вы можете включить эту конфигурацию в свой файл .bashrc
.
Это может быть неочевидно, но перед каждой командой экспорта стоит предшествующий пробел, что обычно гарантирует, что они не будут прочитаны в истории, на всякий случай.
export CF_Key="#########..."
export CF_Email="cfaccount@email.com"
Выпуск сертификата через метод Webroot
При выполнении следующей команды два домена определяются в одном сертификате. Это делается для того, чтобы при запросе любого имени хоста (и часто перенаправлении на каноническое) запрос по-прежнему был защищен безопасным соединением.
acme.sh --issue -d example.com -d www.example.com -w /var/www/html
Выданные сертификаты находятся в /.acme.sh/acme.sh/{domain_name}
Выпустить сертификат с помощью метода DNS
При использовании метода выдачи DNS временная запись txt
создается через API Cloudflare, и LetsEncrypt проверяет домен с помощью этой временной записи. Это более чистый метод, так как не требуется настройка webroot
.
# Multiple Domains
acme.sh --issue --dns dns_cf -d example.com -d www.example.com
Выданные сертификаты находятся в /.acme.sh/acme.sh/{domain_name}
Продление сертификата
По умолчанию Acme.sh создаст cronjob
, подобный следующей записи:
48 0 * * * "/home/user/.acme.sh/acme.sh" --cron --home "/home/user/.acme.sh" > /dev/null
Чтобы принудительно обновить, вы можете ввести следующую команду, которая будет использовать тот же метод выдачи, что и изначально:
acme.sh --renew -d example.com -d www.example.com
Удаление сертификатов
Если вы больше не хотите продлевать сертификат, его очень легко удалить. Однако это не удаляет сертификат с диска. Для этого вам нужно будет перейти к ~/.acme.sh/
и удалить каталог, содержащий сертификаты.
acme.sh --remove -d example.com -d www.example.com
Это позволяет очистить сертификаты, настроенные для обновления, что вы можете проверить, перечислив сертификаты следующим образом:
acme.sh --list
Заключение
LetsEncrypt предлагает отличный и простой в использовании сервис для предоставления SSL-сертификатов для использования на веб-сайтах. Создать безопасный веб-сайт стало проще, чем когда-либо, а использование клиента acme.sh означает, что у вас есть полный контроль над тем, как это происходит на вашем веб-сервере.
При наличии ряда различных методов получения сертификата даже очень безопасные методы, такие как делегированный домен, позволяют правильно получить необходимые сертификаты.