Устанавливаем приложение:
apt install -y certbot

Добавляем конфиг, где указываем свой email в переменную EMAIL, чтобы важные уведомления приходили на него:
EMAIL=youmail@domain.com; \
mkdir -p /etc/letsencrypt; \
tee /etc/letsencrypt/cli.ini <<EOF

#
authenticator = webroot
webroot-path = /var/www/html

#
agree-tos = True
email = $EMAIL

#
text = True
#quiet = True

#
post-hook = service nginx reload

#
max-log-backups = 0
EOF

После проверяем, корректно ли установилось мыло
grep email /etc/letsencrypt/cli.ini

Конфиг NGINX

Настройка NGINX конфига не обязательна, если вы используете modxPanelDaemon последней версии – там уже всё прописано. Просто, надо будет в /var/www/USERNAME/domains.nginx вначале указать set $is_https '1'; и в /var/www/USERNAME/main.nginx раскоментировать #include /etc/nginx/ssl/SITEDOMAIN.conf; указав основной домен сертификата для вашего сайта.
Сделать это нужно после того, как для домена будут выпущены сертификаты.

В ином случае, в конфиг надо добавить, что-то вроде:
listen 80;
listen 443 ssl;
listen [::]:443 ssl;
location /.well-known {
    root /var/www/html;
}
# other code
И service nginx reload

Директория .well-known

Теперь надо проверить, доступна ли директория /.well-known для Let's Encrypt из веба. Для этого в ней создаём тестовый файл
mkdir -p /var/www/html/.well-known/acme-challenge \
&& echo OK > /var/www/html/.well-known/acme-challenge/test.html

Открываем в браузере http://YOU_DOMAIN.ru/.well-known/acme-challenge/test.html, если всё OK, то удаляем тестовые файлы:
rm /var/www/html/.well-known/acme-challenge/test.html && rmdir /var/www/html/.well-known/acme-challenge

Вспомогательные скрипты

Выпуск сертификатов:
tee /usr/local/bin/certbot-certonly <<'EOF'
#!/bin/sh
IFS=","
certbot certonly -d "$*";
EOF
chmod +x /usr/local/bin/certbot-certonly
Использовать так:
certbot-certonly domain.ru www.domain.ru

Создание NGINX конфига сертификатов:
tee /usr/local/bin/update-certs <<'DOC'
#!/bin/bash
mkdir -p /etc/nginx/ssl
for CN in /etc/letsencrypt/live/*/
do
    dest=/etc/nginx/ssl/$(basename $CN).conf
    names=$(openssl x509 -text -in $CN/cert.pem |
        grep -o 'DNS:[^,]*' | cut -f2 -d: | xargs);
    (
        echo "# include ${dest#/etc/nginx/};"
        echo "# server_name $names;"
        echo "ssl_certificate $CN/fullchain.pem;"
        echo "ssl_certificate_key $CN/privkey.pem;"
        echo "ssl_trusted_certificate $CN/chain.pem;"
        echo
    ) | tee $dest;
done
DOC
chmod +x /usr/local/bin/update-certs
Использовать так:
update-certs

Выпускаем сертификаты

certbot-certonly domain.com www.domain.com

Обновляем список конфигов для сертификатов:
update-certs

И проверяем сертификаты в папке:
grep -h '^#' /etc/nginx/ssl/*

Далее, в /var/www/USERNAME/domains.nginx заменить:
set $is_https '0';
на:
set $is_https '1';

А в /var/www/USERNAME/main.nginx раскоментировать #include /etc/nginx/ssl/SITEDOMAIN.conf;, указав основной домен сертификата для вашего сайта.

И service nginx reload

Перевыпуск сертификатов

Добавим в крон перевыпуск сертификатов:
57 */12 * * * certbot renew --allow-subset-of-names

Возможные проблемы

Сайт может не открываться и выдавать «Ошибку соединения».
Тут может потребоваться в /var/www/USERNAME/main.nginx заменить:
listen 443 ssl;
listen [::]:443 ssl;
на:
listen 443 ssl default_server;
listen [::]:443 ssl default_server;

Удаление ненужных сертификатов

Если на сервере нужно удалить некоторые сертификаты, то можно воспользоваться командой:
certbot delete
и выбрать, какие сертификаты надо исключить из перевыпуска.

Либо прямой командой:
certbot delete --cert-name example.com

Необязательные процедуры

Для высокого результата по тесту (https://www.ssllabs.com/ssltest/analyze.html?d=https://www.gvozdb.ru) следует отказаться от DHE шифров в пользу ECDHE. Также с начала 2020 года устарел TLS 1.0/1.1, поэтому придётся обновить NGINX выше версии 1.12, чтобы можно было пользоваться TLS 1.3. Делается по данной статье.