Lego – бесплатный ACME-клиент с открытым исходным кодом, написанный на языке Go. Он предназначен для автоматического получения и продления TLS-сертификатов от удостоверяющих центров, поддерживающих протокол ACME, включая Let’s Encrypt. В отличие от Certbot, lego распространяется в виде отдельного исполняемого файла и не требует установки Python и других дополнительных пакетов.
Lego поддерживает несколько способов подтверждения владения доменом, включая HTTP-01, DNS-01 и TLS-ALPN-01. Благодаря поддержке DNS API различных провайдеров с его помощью можно получать wildcard-сертификаты, которые распространяются как на сам домен, так и на его поддомены. Клиент также может запускать обновление сертификатов в автоматическом режиме, что позволяет использовать его при администрировании веб-серверов.
В статье разберём, как установить lego на виртуальный выделенный сервер, работающий под управлением Ubuntu или Debian, получить TLS-сертификат для домена и настроить веб-сервер для работы по HTTPS на примере Nginx.
Как установить lego
Исходный код lego написан на Go, поэтому при сборке из исходников может потребоваться установка данного языка программирования и соответствующих инструментов. Однако устанавливать Go на сервере не всегда обязательно, поскольку разработчики публикуют готовые исполняемые файлы в разделе релизов проекта на GitHub.
Это – более удобный вариант для настройки HTTPS на виртуальном сервере. Используя архив дистрибутива, достаточно распаковать его и разместить исполняемый файл lego в каталоге, доступном из PATH, например, /usr/local/bin. После этого можно будет запускать ACME-клиент без отдельной установки Go.
Актуальные архивы доступны в разделе Releases официального репозитория lego на GitHub. Перейдите на данную страницу, выберите версию и скопируйте ссылку на загрузку архива для linux/amd64.

Затем при помощи утилиты wget и копированной ссылки загрузите архив в текущий каталог:
$ wget https://github.com/go-acme/lego/releases/download/v5.5.2/lego_v5.5.2_linux_amd64.tar.gz
По окончании загрузки распакуйте полученный архив:
$ tar -xvf lego_v5.5.2_linux_amd64.tar.gz
При помощи следующей команды скопируйте исполняемый файл lego в каталог /usr/local/bin/lego и установите для него права доступа 0755:
$ sudo install -m 0755 lego /usr/local/bin/lego
В результате файл lego окажется в директории /usr/local/bin, которая, как правило, входит в переменную окружения PATH. После чего клиент можно будет запускать из любого каталога системы. Чтобы убедиться в этом, выведите версию установленного ACME-клиента:
$ lego --version

Как получить TLS-сертификат при помощи lego
Следующая команда предназначена для запуска процесса получения TLS-сертификата через ACME-протокол. В данном примере применяется проверка HTTP-01. При её использовании lego размещает специальный проверочный файл в каталоге сайта. Сервер Let’s Encrypt, в свою очередь, обращается к размещённому файлу по HTTP для подтверждения контроля над доменом.
$ lego run --email="admin@your-domain-name.ru" \
--http --http.webroot /var/www/your-domain-name.ru/html \
--domains="your-domain-name.ru"
Здесь:
run– команда для запуска процедуры получения сертификата, при выполнении которой lego также выполнит регистрацию на ACME-сервере, если необходимые данные учётной записи ещё не сохранены;--email="admin@your-domain-name.ru"– параметр указывает адрес электронной почты для регистрации учётной записи на ACME-сервере;--http– метод проверки владения доменом, то есть HTTP-01;--http.webroot /var/www/your-domain-name.ru/html– корневой каталог сайта, в котором lego создаст проверочный файл;--domains="your-domain-name.ru"– домен, для которого запрашивается сертификат.
В ходе выполнения команды lego обращается к ACME-серверу и создаёт учётную запись либо использует существующую. Клиент подготавливает проверочный файл и размещает его в подкаталоге .well-known/acme-challenge внутри указанного в параметре --http.webroot. Let’s Encrypt обращается к адресу вида http://your-domain-name.ru/.well-known/acme-challenge/... и проверяет содержимое файла. При этом для успешного прохождения проверки домен должен указывать на IP-адрес виртуального сервера, а входящие HTTP-запросы на порт 80 должны быть доступны извне.
Если проверка завершается успешно, lego получает TLS-сертификат и сохраняет его вместе с закрытым ключом в своём каталоге данных. По умолчанию это .lego в домашней директории пользователя, от имени которого запускается команда. Путь к каталогу данных можно изменить при помощи дополнительного параметра --path.
Вывод команды содержит два основных файла, например, your-domain-name.ru.crt и your-domain-name.ru.key. Данные файлы потребуются для настройки HTTPS на веб-сервере, в нашем случае – Nginx:
your-domain-name.ru.crt– файл TLS-сертификата, который веб-сервер предъявляет клиентам при подключении по HTTPS;your-domain-name.ru.key– файл закрытого ключа, соответствующего открытому ключу в сертификате, который используется при выполнении криптографических операций, необходимых для защищённого соединения.

Как настроить HTTPS-доступ на Nginx
После получения сертификата необходимо настроить Nginx на использование созданных файлов. Для этого откройте для редактирования файл конфигурации Nginx:
$ sudo nano /etc/nginx/sites-available/your-domain-name.ru
В файл добавьте блок server, который отвечает за подключение по HTTPS:
server {
listen 80;
listen [::]:80;
server_name your-domain-name.ru www.your-domain-name.ru;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name your-domain-name.ru www.your-domain-name.ru;
root /var/www/your-domain-name.ru/html;
index index.html index.htm index.nginx-debian.html;
ssl_certificate /home/your-user/.lego/certificates/your-domain-name.ru.crt;
ssl_certificate_key /home/your-user/.lego/certificates/your-domain-name.ru.key;
location / {
try_files $uri $uri/ =404;
}
}
В данном блоке кроме всего прочего укажите пути из вывода команды lego run:
- в параметр
ssl_certificateвставьте полный путь до файла TLS-сертификата; - в параметр
ssl_certificate_key– полный путь до файла закрытого ключа.
Также в блок server, отвечающий за обработку HTTP-запросов, добавьте директиву return 301 https://$host$request_uri;. Данная строка указывает веб-серверу перенаправлять HTTP-подключения на HTTPS.
Закройте файл с сохранением внесённых изменений, после чего проверьте синтаксис Nginx на корректность:
$ sudo nginx -t

Если ошибок нет, перезапустите конфигурацию веб-сервера:
$ sudo systemctl reload nginx
Чтобы убедиться в том, что подключение к веб-странице осуществляется при помощи HTTPS, откройте браузер и перейдите по ссылке вида https://your-domain-name.ru, где вместо your-domain-name.ru укажите имя вашего домена.

