Featured image of post Запрос SSL-сертификата для сайта с помощью acme.sh через http и dnsapi

Запрос SSL-сертификата для сайта с помощью acme.sh через http и dnsapi

acme.sh реализует протокол acme, позволяя получать бесплатные сертификаты от letsencrypt ...

acme.sh реализует протокол acme, позволяющий получать бесплатные сертификаты от letsencrypt.

Основные шаги:

  1. Установить acme.sh
  2. Сгенерировать сертификат
  3. Скопировать сертификат в nginx/apache или другой сервис
  4. Обновить сертификат
  5. Обновить acme.sh
  6. Что делать в случае ошибки, как отлаживать

acme.sh http и dnsapi для получения SSL сертификата сайта
Ниже приведен подробный обзор.

1. Установка acme.sh

Установка очень проста и выполняется одной командой:

1
curl https://get.acme.sh | sh -s [email protected]

Установку могут выполнять как обычные пользователи, так и root. Процесс установки включает в себя следующие шаги:

  1. acme.sh будет установлен в ваш домашний каталог:
1
~/.acme.sh/
  1. Создается alias для удобства использования, например в .bashrc: alias acme.sh=~/.acme.sh/acme.sh.

  2. Автоматически создается cronjob, который каждый день в 00:00 проверяет все сертификаты и, если срок их действия истекает, автоматически обновляет их.

Для более сложных опций установки, смотрите: https://github.com/Neilpang/acme.sh/wiki/How-to-install.

Установка не влияет на существующие функции и файлы системы, все изменения ограничены директориями установки: ~/.acme.sh/.

2. Генерация сертификата

acme.sh поддерживает все протоколы проверки, предусмотренные протоколом acme. Обычно используются два метода проверки: http и dns.

1. Метод http

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

1
acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/

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

Если вы используете apache сервер, acme.sh может автоматически определить конфигурацию apache и выполнить проверку без указания корневой директории:

1
acme.sh --issue -d mydomain.com --apache

Если у вас nginx, acme.sh также сможет автоматически выполнить проверку на основе конфигурации nginx без указания корневой директории:

1
acme.sh --issue -d mydomain.com --nginx

Заметьте, что после завершения проверки в обоих режимах acme.sh восстанавливает предыдущие настройки и не вносит изменения в вашу конфигурацию. Это защищает вас от повреждения настроек, но вы также должны самостоятельно настроить конфигурацию SSL, иначе, хотя сертификаты будут успешно сгенерированы, ваш сайт все равно останется недоступным по https. Чтобы обеспечить безопасность, лучше выполнить конфигурацию вручную.

Если вы еще не запустили никакие веб-сервисы и порт 80 свободен, acme.sh может временно выступить в роли веб-сервера, прослушивая 80 порт для завершения проверки:

1
acme.sh --issue -d mydomain.com --standalone

Для более сложного использования смотрите: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert.

2. Метод ручного dns

Вы можете вручную добавить запись типа txt в системе dns для проверки прав собственности на домен.

Преимущество этого метода в том, что вам не требуется никакой сервер или публичный IP-адрес, достаточно только записи dns для завершения проверки. Недостаток состоит в том, что без автоматической настройки DNS API acme.sh не сможет автоматически обновлять сертификаты, вам придется каждый раз вручную подтверждать право собственности на домен.

1
acme.sh --issue --dns -d mydomain.com --yes-I-know-dns-manual-mode-enough-go-ahead-please

Затем acme.sh сгенерирует требуемую запись, которая появится в вашем интерфейсе управления доменами. После завершения настройки запустите генерацию сертификата:

1
acme.sh --renew -d mydomain.com --yes-I-know-dns-manual-mode-enough-go-ahead-please

Обратите внимание, что здесь используется команда --renew.

Настоящая сила метода dns состоит в том, что можно использовать API, предоставляемые провайдерами доменных имен, для автоматического добавления txt-записей для завершения проверки.

acme.sh поддерживает автоматическую интеграцию с множеством DNS-провайдеров, таких как Cloudflare, DNSPod, CloudXNS, GoDaddy и OVH.

Например, для DNSPod вам необходимо войти в ваш аккаунт DNSPod и создать ваш api id и api key бесплатно. Затем выполните:

1
2
3
export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
acme.sh --issue --dns dns_dp -d aa.com -d www.aa.com

Сертификат будет сгенерирован автоматически, указанные api id и api key будут автоматически сохранены, и в будущем вам не нужно будет повторно указывать их при использовании API DNSPod:

1
acme.sh --issue -d mydomain2.com --dns dns_dp

Для получения более подробной информации об использовании API смотрите: https://github.com/Neilpang/acme.sh/blob/master/dnsapi/README.md.

3. Копирование/установка сертификата

После генерации сертификата вам нужно скопировать его в нужное место.

Обратите внимание, что по умолчанию сгенерированные сертификаты хранятся в каталоге установки: ~/.acme.sh/. Не используйте файлы из этого каталога напрямую, например, нельзя напрямую указывать их в конфигурационных файлах nginx/apache. Эти файлы предназначены для внутреннего использования, и структура каталогов может изменяться.

Правильный способ использования — это команда --install-cert, где вы можете указать целевое местоположение. Затем файлы сертификатов будут скопированы в соответствующие местоположения, например:

Пример для Apache:

1
2
3
4
5
acme.sh --install-cert -d example.com \
--cert-file      /path/to/certfile/in/apache/cert.pem  \
--key-file       /path/to/keyfile/in/apache/key.pem  \
--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \
--reloadcmd     "service apache2 force-reload"

Пример для Nginx:

1
2
3
4
acme.sh --install-cert -d example.com \
--key-file       /path/to/keyfile/in/nginx/key.pem  \
--fullchain-file /path/to/fullchain/nginx/cert.pem \
--reloadcmd     "service nginx force-reload"

(Небольшое напоминание: здесь используется service nginx force-reload, а не service nginx reload. По результатам тестирования, reload не перезагружает сертификаты, поэтому используется force-reload).

В конфигурации Nginx для ssl_certificate укажите путь /etc/nginx/ssl/fullchain.cer, а не /etc/nginx/ssl/<domain>.cer, иначе SSL Labs выдаст ошибку Chain issues Incomplete.

Команда --install-cert может принимать множество параметров для указания целевых файлов. Также можно указать reloadcmd, который будет автоматически вызван при обновлении сертификата.

Подробные параметры смотрите: https://github.com/Neilpang/acme.sh#3-install-the-issued-cert-to-apachenginx-etc.

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

4. Просмотр информации о установленных сертификатах

Для просмотра информации об установленном сертификате выполните:

1
acme.sh --info -d example.com

Команда выведет информацию, подобную следующей:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
DOMAIN_CONF=/root/.acme.sh/example.com/example.com.conf
Le_Domain=example.com
Le_Alt=no
Le_Webroot=dns_ali
Le_PreHook=
Le_PostHook=
Le_RenewHook=
Le_API=https://acme-v02.api.letsencrypt.org/directory
Le_Keylength=
Le_OrderFinalize=https://acme-v02.api.letsencrypt.org/acme/finalize/23xxxx150/781xxxx4310
Le_LinkOrder=https://acme-v02.api.letsencrypt.org/acme/order/233xxx150/781xxxx4310
Le_LinkCert=https://acme-v02.api.letsencrypt.org/acme/cert/04cbd28xxxxxx349ecaea8d07
Le_CertCreateTime=1649358725
Le_CertCreateTimeStr=Thu Apr  7 19:12:05 UTC 2022
Le_NextRenewTimeStr=Mon Jun  6 19:12:05 UTC 2022
Le_NextRenewTime=1654456325
Le_RealCertPath=
Le_RealCACertPath=
Le_RealKeyPath=/etc/acme/example.com/privkey.pem
Le_ReloadCmd=service nginx force-reload
Le_RealFullChainPath=/etc/acme/example.com/chain.pem
Создано при помощи Hugo
Тема Stack, дизайн Jimmy