Установка TLS-сертификата с помощью acme.sh позволяет настроить HTTPS-доступ к сайту и автоматизировать дальнейшее продление сертификата. acme.sh – лёгкий ACME-клиент, написанный на Shell, который предназначен для автоматического выпуска, установки и продления TLS-сертификатов. В сущности, acme.sh представляет собой скрипт, поддерживающий различные центры сертификации, в том числе Let’s Encrypt, и несколько способов подтверждения владения доменом, включая HTTP-01 и DNS-01. Также скрипт поддерживает выпуск и автоматическое продление Wildcard-сертификатов и может использовать интеграцию с API DNS-провайдеров. Скрипт acme.sh, в отличие от Certbot, не требует Python и работает без установки дополнительных зависимостей.
В статье разберём, как с использованием acme.sh установить TLS-сертификат для настройки HTTPS-доступа к веб-странице, работающей на Nginx. В качестве примера ниже разобран вариант, в основе которого – виртуальный выделенный сервер, работающий под управлением Ubuntu или Debian.
Установка acme.sh
Чтобы отслеживать сроки действия установленных сертификатов, скрипт acme.sh добавляет соответствующее задание в crontab. При этом скрипт, как правило, выполняет запланированное задание несколько раз в сутки. Для установки cron выполните команду:
$ sudo apt install cron
Также установите curl – консольную утилиту, которая предназначена для передачи данных по различным сетевым протоколам и позволяет, например, загружать файлы и получать содержимое веб-страниц:
$ sudo apt install curl
Затем перейдите в домашний каталог вашего пользователя:
$ cd ~
Где запустите команду для установки acme.sh:
$ curl https://get.acme.sh | sh
Дождитесь окончания выполнения команды и проверьте корректность установки через вывод версии acme.sh:
$ ~/.acme.sh/acme.sh --version

Также проверьте доступность сайта по HTTP непосредственно из командной строки SSH-подключения. В данной команде замените your-domain-name.ru на доменное имя, связанное с IP-адресом вашего VPS:
$ curl -I http://your-domain-name.ru

Выпуск TLS-сертификата с использованием acme.sh
Следующую команду запустите от имени вашей учётной записи:
$ /home/your-user/.acme.sh/acme.sh --issue --server letsencrypt \
-d your-domain-name.ru -d www.your-domain-name.ru \
-w /var/www/your-domain-name.ru/html
В данном случае:
your-user– имя пользователя, от имени которого выполняется команда и в домашнем каталоге которого размещён скрипт acme.sh;--issue– параметр, инициирующий выпуск сертификата;--server letsencrypt– означает, что в качестве ACME-сервера используется Let’s Encrypt;-d– после данного параметра указывается доменное имя, для которого будет выпущен сертификат;-w– параметр указывает корневой каталог сайта, в которомacme.shразместит проверочные файлы.
В случае успешного выпуска скрипт acme.sh сохранит сертификат в своём рабочем каталоге.
Создание и настройка каталога для TLS-сертификата
После получения сертификата необходимо выполнить следующий этап установки TLS-сертификата — подготовить каталог для хранения файлов сертификата и приватного ключа. Делается это также при помощи acme.sh. Сначала создайте каталог, в котором будут находиться файлы сертификата и приватного ключа для конкретного домена:
$ sudo mkdir -p /etc/nginx/ssl/your-domain-name.ru/
Затем назначьте вашего пользователя и его группу владельцами созданного каталога и всех находящихся там файлов. Это позволит вашей учётной записи управлять сертификатами, а веб-сервер сохранит возможность читать необходимые файлы:
$ sudo chown -R your-user:your-user /etc/nginx/ssl/your-domain-name.ru
После чего установите права доступа к каталогу:
$ sudo chmod 750 /etc/nginx/ssl/your-domain-name.ru
В данном случае владелец получает полный доступ, участники группы – право просмотра содержимого, а остальные пользователи не получают никаких прав, что позволит ограничить доступ к файлам сертификатов и приватному ключу.
Настройка sudoers для обновления TLS-сертификата через acme.sh
Скрипт acme.sh умеет самостоятельно обновлять TLS-сертификаты и для обеспечения полной автоматизации данного процесса может выполнять предварительно заданные команды. Например, для того чтобы Nginx перечитал сертификаты и применил изменения без остановки веб-сервера, скрипт должен выполнить команду sudo systemctl reload nginx. Для этого пользователю, от имени которого работает acme.sh, необходимо разрешить перезапуск конфигурации Nginx без ввода пароля, но и без предоставления данной учётной записи полных прав суперпользователя. Такой подход позволит автоматизировать обновление сертификатов, сохранив ограниченный доступ к административным операциям.
Чтобы это сделать, в sudoers нужно добавить правило, разрешающее выполнение только указанной команды с правами root. Для этого сначала выясните полный путь к systemctl:
$ which systemctl
Из вывода команды видно, что systemctl находится в директории /usr/bin/. В правиле sudoers необходимо использовать именно этот полный путь.

При помощи специального редактора visudo откройте файл, предназначенный для настройки прав учётных записей на выполнение отдельных команд с привилегиями суперпользователя. В данном случае – чтобы acme.sh мог автоматически перезагружать конфигурацию Nginx после обновления сертификата:
$ sudo visudo -f /etc/sudoers.d/acme-nginx
Добавьте одну строку, в которой your-user замените на имя вашего пользователя:
your-user ALL=(root) NOPASSWD: /usr/bin/systemctl reload nginx
Закройте файл, сохранив внесённые изменения. После чего для данного файла установите права 0440, то есть чтение для владельца и группы, без права записи:
$ sudo chmod 0440 /etc/sudoers.d/acme-nginx
Затем выполните проверку файлов правил sudoers на синтаксическую корректность:
$ sudo visudo -c
Вывод команды не должен содержать каких-либо ошибок.

Установка TLS-сертификата в Nginx с использованием acme.sh
Следующей командой установите сертификат в Nginx:
$ /home/your-user/.acme.sh/acme.sh --install-cert \
-d your-domain-name.ru \
--ecc --key-file /etc/nginx/ssl/your-domain-name.ru/privkey.pem \
--fullchain-file /etc/nginx/ssl/your-domain-name.ru/fullchain.pem \
--reloadcmd "sudo -n /usr/bin/systemctl reload nginx"
В команде следует использовать созданный ранее каталог, из которого Nginx будет загружать выпущенный сертификат. Кроме того, в данном случае применяются следующие параметры:
--install-cert– устанавливает сертификат в рабочие файлы, указанные в параметрах команды;-d your-domain-name.ru– указывает домен, для которого ранее был выпущен сертификат;--ecc– указывает на необходимость использования сертификата, связанного с ECC-ключом (данный параметр нужен, если сертификат был выпущен с использованием ECC-ключа, напримерec-256);--key-file /etc/nginx/ssl/your-domain-name.ru/privkey.pem– задаёт путь, по которому будет сохранён приватный ключ сертификата;--fullchain-file /etc/nginx/ssl/your-domain-name.ru/fullchain.pem– задаёт путь для сохранения полной цепочки сертификатов, включающей сертификат домена и необходимые промежуточные сертификаты;--reloadcmd "sudo -n /usr/bin/systemctl reload nginx"– содержит команду, которую acme.sh будет выполнять после установки или обновления сертификата для перезагрузки конфигурации Nginx без полной остановки веб-сервера, позволяя тем самым начать использовать обновлённый сертификат (параметр-nв командеsudoзапрещает запрос пароля, при этом если выполнение без пароля невозможно, команда завершится ошибкой вместо ожидания ввода).
Настройка использования TLS-сертификата в Nginx
В ходе выполнения приведённой выше команды скрипт acme.sh найдёт сертификат и приватный ключ в своём рабочем каталоге, после чего по указанным путям скопирует их в /etc/nginx/ssl/your-domain-name.ru/. Далее скрипт сохранит указанные параметры установки для последующих продлений сертификата. В дальнейшем при автоматическом выполнении данной процедуры acme.sh обновит рабочие файлы сертификата и ключа, после чего выполнит заданную команду перезапуска конфигурации Nginx для применения обновлённого сертификата.
Поскольку приватный ключ должен быть защищён от доступа посторонних пользователей, для него необходимо установить права 600. Для публичного же сертификата достаточно прав 644:
$ sudo chmod 600 /etc/nginx/ssl/your-domain-name.ru/privkey.pem
$ sudo chmod 644 /etc/nginx/ssl/your-domain-name.ru/fullchain.pem
Затем внесите изменения в конфигурацию сайта:
$ sudo nano /etc/nginx/sites-available/your-domain-name.ru
В блок server, отвечающий за подключение по HTTP, вставьте строку настройки перенаправления HTTP на HTTPS. Кроме того, в конфигурацию добавьте блок server, отвечающий за подключение по HTTPS, где в частности укажите путь к файлам приватного ключа и сертификата.
server
{
listen 80;
root /var/www/your-domain-name.ru/html;
index index.html index.htm index.nginx-debian.html;
server_name your-domain-name.ru www.your-domain-name.ru;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name your-domain-name.ru www.your-domain-name.ru;
ssl_certificate_key /etc/nginx/ssl/your-domain-name.ru/privkey.pem;
ssl_certificate /etc/nginx/ssl/your-domain-name.ru/fullchain.pem;
root /var/www/your-domain-name.ru/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
Закройте файл с сохранением внесённых изменений и проверьте конфигурацию Nginx на корректность:
$ sudo nginx -t
В выводе команды не должно быть сообщений о каких-либо ошибках.

Если ошибок нет, примените изменения:
$ sudo systemctl reload nginx
Проверка установки TLS-сертификата и возможности подключения по HTTPS
После успешного выпуска и установки сертификата acme.sh будет использовать сохранённый способ проверки и при его продлении. Проверить установленные параметры сертификата можно при помощи команды:
$ /home/your-user/.acme.sh/acme.sh --info -d your-domain-name.ru --ecc
Вывод команды позволяет убедиться в том, что acme.sh сохранил конфигурацию сертификата, использует ECC-ключ, выполняет проверку домена через HTTP-01 и сохраняет пути к файлам, используемым Nginx. Также в конфигурации указана команда автоматической перезагрузки Nginx после установки обновлённого сертификата.

Для подключения непосредственно к сайту, защищённому при помощи HTTPS, необходимо в брандмауэре UFW разрешить доступ к серверу по данному протоколу:
$ sudo ufw allow https
После чего откройте браузер и перейдите по ссылке вида https://your-domain-name.ru, заменив your-domain-name.ru на доменное имя вашего сайта.

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