--- title: "How-To: Генерация SSL/TLS сертификатов с помощью acme.sh" title_bar: 1 icon: "newspaper-o" tags: author: "digital-freak.ru" description: "Генерация SSL/TLS-сертификатов от Let's Encrypt" keywords: "acme.sh,SSL,сертификат" --- | [`security/acme.sh`](http://www.freshports.org/security/acme.sh) - это shell-скрипт с минимальными зависимостями для генерации SSL/TLS-сертификатов от [Let's Encrypt](https://letsencrypt.org/). Он придерживается той же философии, что и `portmaster` для управления портами FreeBSD. `security/acme.sh` - это скрипт для управления SSL/TLS-сертификатами. Эти сертификаты полностью функциональны и не будут выдавать никаких предупреждений о безопасности, как самоподписанные сертификаты. Note: Обратите внимание, что [freebsd.org](https://freebsd.org/) использует "Let's Encrypt" и, по-видимому, даже использует `security/acme.sh`. ### Зачем использовать `security/acme.sh`? Существует большой выбор инструментов для запроса сертификатов от Let's Encrypt, но для них требуется множество зависимостей и права суперпользователя. `security/acme.sh` очень минималистичная реализация протокола ACME, который используется для автоматизации запроса и обновления SSL/TLS-сертификатов. ### Установка ``` shell # pkg install security/acme.sh ``` ### Запрос сертификата Если у вас уже есть работающий на 80 порту веб-сервер: ``` shell # 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 ``` Если на этом хосте нет веб-сервера, вам нужно будет запускать скрипт в автономном режиме: ``` shell % 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` сделать это за вас: ``` shell % 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`: ``` shell # crontab -u www -e ``` ``` bash # 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](https://forums.freebsd.org/members/50045/), [Jun 7, 2017](https://forums.freebsd.org/threads/61231/)