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
Обратите внимание на некоторые моменты:
- Мы запрашиваем сертификат на www.example.com. Очевидно, вам нужно изменить это имя на полное доменное имя вашего домена. Домен должен разрешаться в адрес вашего хоста и быть доступен из Интернета.
- Вызов
--standalone
должен временно занять 80 порт и, следовательно, должен выполнятся с правами суперпользователя. --home /usr/local/etc/acme.sh
является произвольным каталогом. Он используется для хранения сгенерированных сертификатов и файлов конфигурации дляacme.sh
. По умолчанию скрипт хранит свои файлы в~/acme.sh
, но я решил использовать/usr/local/etc/acme.sh
, потому что это имеет больше смысла, когда нам нужно обновить сертификаты.- Параметр
-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 как
пользователь с ограниченными правами, и нам нужны привилегии суперпользователя
для перезапуска веб-сервера.