How-To: Генерация SSL/TLS сертификатов с помощью acme.sh

security/acme.sh - это shell-скрипт с минимальными зависимостями для генерации SSL/TLS-сертификатов от Let's Encrypt.

Он придерживается той же философии, что и portmaster для управления портами FreeBSD.

security/acme.sh - это скрипт для управления SSL/TLS-сертификатами.

Эти сертификаты полностью функциональны и не будут выдавать никаких предупреждений о безопасности, как самоподписанные сертификаты.

Note: Обратите внимание, что freebsd.org использует "Let's Encrypt" и, по-видимому, даже использует security/acme.sh.

Зачем использовать security/acme.sh?

Существует большой выбор инструментов для запроса сертификатов от Let's Encrypt, но для них требуется множество зависимостей и права суперпользователя. security/acme.sh очень минималистичная реализация протокола ACME, который используется для автоматизации запроса и обновления SSL/TLS-сертификатов.

Установка

# pkg install security/acme.sh

Запрос сертификата

Если у вас уже есть работающий на 80 порту веб-сервер:

# mkdir /usr/local/etc/acme.sh/
# chown www /usr/local/etc/acme.sh/
# su -m www
% acme.sh --issue --home /usr/local/etc/acme.sh -d www.example.com -w /usr/local/www

Если на этом хосте нет веб-сервера, вам нужно будет запускать скрипт в автономном режиме:

% su
# acme.sh --issue -d www.example.com --home /usr/local/etc/acme.sh --standalone

Обратите внимание на некоторые моменты:

  1. Мы запрашиваем сертификат на www.example.com. Очевидно, вам нужно изменить это имя на полное доменное имя вашего домена. Домен должен разрешаться в адрес вашего хоста и быть доступен из Интернета.
  2. Вызов --standalone должен временно занять 80 порт и, следовательно, должен выполнятся с правами суперпользователя.
  3. --home /usr/local/etc/acme.sh является произвольным каталогом. Он используется для хранения сгенерированных сертификатов и файлов конфигурации для acme.sh. По умолчанию скрипт хранит свои файлы в ~/acme.sh, но я решил использовать /usr/local/etc/acme.sh, потому что это имеет больше смысла, когда нам нужно обновить сертификаты.
  4. Параметр -w /usr/local/www - это каталог в котором сценарий будет сохранять временные данные для чтения центром сертификации. Он должен быть доступен для записи пользователю, запустившему сценарий (например пользователю www).

Установка сертификата

Скрипт acme.sh создает набор сертификатов:

  • Ваш сертификат в файле /usr/local/etc/acme.sh/www.example.com/www.example.com.cer
  • Приватный ключ сертификата в файле /usr/local/etc/acme.sh/www.example.com/www.example.com.key
  • Промежуточный сертификат центра сертификации в файле /usr/local/etc/acme.sh/www.example.com/ca.cer
  • И полная цепочка сертификатов в файле /usr/local/etc/acme.sh/www.example.com/fullchain.cer

Здесь у вас есть несколько вариантов:

  • указать в конфигурации веб-сервера эти файлы;
  • скопировать файлы в каталог ./ssl/ вашего веб-сервера;
  • или позволить acme.sh сделать это за вас:
% acme.sh --install-cert \
        --home /usr/local/etc/acme.sh \
        -d www.example.com \
        --cert-file /usr/local/etc/nginx/ssl/www.example.com/www.example.com.cer \
        --key-file /usr/local/etc/nginx/ssl/www.example.com/www.example.com.key \
        --fullchain-file /usr/local/etc/nginx/ssl/www.example.com/fullchain.cer \
        --reloadcmd "sudo service nginx restart"

Обновление сертификата

Сертификаты Let's Encrypt имеют короткий срок действия (90 дней) и должны обновляться вручную или автоматически, и скрипт acme.sh может позаботиться об этом.

Просто создайте задание в планировщике как пользователь выполняющий скрипт. В нашем случае это пользователь www:

# crontab -u www -e
# Attempt to renew the certificates every once in a while: 
45 1 * * * /usr/local/sbin/acme.sh --cron --home /usr/local/etc/acme.sh --reloadcmd "/usr/local/bin/sudo /usr/sbin/service nginx restart" > /dev/null

Это задание будет запускаться каждую ночь. Сценарий проверяет, не истек ли срок действия сертификата, и при необходимости обновляет его.

После обновления сертификата скрипт перезапускает веб-сервер (в данном случае nginx).

security/sudo используется, потому что мы выполняем задание cron как пользователь с ограниченными правами, и нам нужны привилегии суперпользователя для перезапуска веб-сервера.

Donald Baud, Jun 7, 2017