5.3.12. Установка SSL-сертификата от Let's Encrypt с помощью Certbot

Одним из самых простых способов получения сертификата от Let's Encrypt является использование Certbot. Он даёт возможность автоматически пройти проверку и получить необходимый сертификат.

Установка Certbot

Установить Certbot можно через пакетный менеджер Snap (рекомендуется) или Python pip.

Способ подходит для следующих ОС:
  • Fedora
  • Debian
  • Ubuntu
  • CentOS
  • ArchLinux
  • OpenSUSE

Информация по другим ОС доступна на официальном сайте.

  1. Подключитесь к серверу по SSH.
  2. Установите Snap (если не установлен):
    • Ubuntu и Debian:
      sudo apt update; sudo apt install snapd
    • Fedora и CentOS:
      sudo dnf install snapd
      • Для старых версий используйте yum вместо dnf:
        sudo yum install snapd
  3. Установите основные пакеты Snap:
    sudo snap install core; sudo snap refresh core
  4. Установите Certbot:
    sudo snap install --classic certbot
  5. Создайте символическую ссылку для более удобного вызова Certbot:
    sudo ln -s /snap/bin/certbot /usr/bin/certbot
  1. Подключитесь к серверу по SSH.
  2. Установите Python (если не установлен):
    • Ubuntu и Debian:
      sudo apt update; sudo apt install python3 python3-venv libaugeas0
    • Fedora и CentOS:
      sudo dnf install python3 augeas-libs
  3. Создайте виртуальное окружение:
    sudo python3 -m venv /opt/certbot/
    sudo /opt/certbot/bin/pip install --upgrade pip
  4. Установите Certbot:
    sudo /opt/certbot/bin/pip install certbot certbot-nginx
  5. Создайте символическую ссылку для более удобного вызова Certbot:
    sudo ln -s /opt/certbot/bin/certbot /usr/bin/certbot
  6. Добавьте задачу cron для автоматической выписки сертификата:
    echo "0 0,12 * * * root /opt/certbot/bin/python -c 'import random; import time; time.sleep(random.random() * 3600)' && sudo renew -q" | sudo tee -a /etc/crontab > /dev/null

Важные моменты:

  • Получить сертификат можно только для рабочего домена с корректно направленными на сервер адресными записями. Получить сертификат на IP-адрес без домена невозможно.
  • Certbot запрашивает сертификаты у компании Let's Encrypt, которая имеет свои ограничения.
  • Для получения сертификата Certbot создаёт внутри каталогов сайтов временные файлы в подкаталогах .well-known/acme-challenge, которые затем опрашивает Let's Encrypt.

Важные моменты:

  • Установка сертификата временно останавливает работу веб-сервера.
  • Установка сертификатов для веб-серверов Apache и nginx выполняется полностью автоматически. Для установки используются домены, настроенные в конфигурационных файлах веб-сервера. Убедитесь, что конфигурационные файлы настроены верно.

Получить сертификат можно двумя способами:

  • Получение сертификата и внесение изменений в конфигурацию веб-сервера (вместо webservice укажите ваш веб-сервер — apache или nginx):
    sudo certbot --webservice
  • Получение сертификата без внесения изменений в конфигурацию веб-сервера (вместо webservice укажите ваш веб-сервер — apache или nginx):
    sudo certbot certonly --webservice

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

sudo certbot renew --dry-run
Создать запроса на получение wildcard-сертификата можно вручную или автоматически. Основное отличие в том, что автоматический способ требует использования скриптов, которые будут создавать проверочную DNS-запись и ожидать некоторое время для обновления данных в системе DNS.

Вручную

Важные моменты:

  • Для получения сертификата необходимо будет самостоятельно создать проверочную DNS-запись.
  • Ручное получение сертификата не влияет на работу веб-сервера. После получения сертификата необходимо самостоятельно установить его для сайта на своем сервере.
  • Полученный вручную сертификат не перевыпустится автоматически при истечении его срока действия. Чтобы сертификат автоматически перевыпускался, необходимо настроить дополнительные hook-параметры –manual-auth-hook и –manual-cleanup-hook, указывающие путь к скриптам создания и удаления проверочных DNS-записей.

Получение wildcard-сертификата сложнее, чем получение обычного, так как проверка владения доменом происходит с помощью создания проверочной DNS-записи.

  1. Подключитесь к серверу по SSH.
  2. Установите Certbot (если не установлен).
  3. Выполните команду:
    certbot certonly --manual --preferred-challenges=dns --email admin@example.com --server https://acme-v02.api.letsencrypt.org/directory --agree-tos -d example.com -d *.example.com

    В команде используйте свои данные:

    • admin@example.com — доступный вам почтовый ящик, который будет использоваться для получения важной информации о проекте.
    • -d example.com -d *.example.com — домены, для которых будет выписан сертификат. Несколько доменов можно указать с помощью параметра -d или перечислить их через запятую без пробелов. Для получения wildcard-сертификата в начале домена необходимо указать *..
  4. Если команда запускается впервые, нужно будет пройти короткую регистрацию непосредственно в терминале и указать свои данные.
  5. После создания заявки на получение сертификата в терминале будет выведен текст:
    Please deploy a DNS TXT record under the name:
    _acme-challenge.example.com.
    with the following value:
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Добавьте DNS-запись следующим образом:

    • «Субдомен» — _acme-challenge. Если сертификат создаётся для поддомена, то необходимо указать _acme-challenge.sub, где вместо sub — ваш поддомен.
    • «Тип» — «TXT».
    • «Данные» — данные, указанные в терминале (строка XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX из примера).
  6. Подождите несколько минут и перейдите к следующему шагу подтверждения выполненных действий и проверки созданной записи, дважды нажав Enter. Если перейти к этим шагам слишком быстро, то записи могут не успеть обновиться на стороне DNS, что приведет к неуспешной проверке и потребует повторной подачи запроса с использованием нового проверочного кода в DNS-записи. Проверить наличие записи для поддомена _acme-challenge можно с помощью инструмента dig.
  7. Созданные файлы сертификата будут расположены в каталоге вида /etc/letsencrypt/live/example.com/, где вместо example.com будет ваш домен, для которого был выписан сертификат.

Автоматически

Важные моменты:

  • Автоматическое получение сертификата это сложный процесс, который включает использование дополнительных hook-параметров –manual-auth-hook и –manual-cleanup-hook, указывающих путь к скриптам создания и удаления проверочных DNS-записей с помощью API.
  • В данной статье приведены только примеры скриптов для выполнения задач по созданию и удалению DNS-записей. Перед использованием настоятельно рекомендуем сохранить текущие DNS-записи для возможности восстановления.
  • Приведённые примеры скриптов не работают для поддоменов, но сам сертификат будет выписан с учётом всех возможных поддоменов.
  1. Подключитесь к серверу по SSH.
  2. Установите Certbot (если не установлен).
  3. Загрузите примеры скриптов на сервер в подходящий каталог, к которому будет доступ у Certbot, и вместо AdmToolsToken укажите токен API вашей учётной записи:
    authenticator.sh
    #!/bin/bash
    
    # Bearer authentication
    AUTH_TOKEN="AdmToolsToken"
    
    # Definitions for subdomain
    CREATE_DOMAIN="_acme-challenge"
    
    # Getting domain id
    DOMAIN_ID=$(curl -s -X POST "https://adm.tools/action/get_id/" \
        -H "Authorization: Bearer $AUTH_TOKEN" \
        -d "name=$CERTBOT_DOMAIN&type=domain" | \
        grep -oP '(?<="domain_id":")[^"]+')
    
    if [ -z "$DOMAIN_ID" ]; then
        echo "Domain ID not found for $CERTBOT_DOMAIN"
        exit 1
    fi
    
    # Getting list of domain records for deleting
    RECORDS=$(curl -s -X POST "https://adm.tools/action/dns/records_list/" \
        -H "Authorization: Bearer $AUTH_TOKEN" \
        -d "domain_id=$DOMAIN_ID" | jq -r '.response.list[] | select(.record == "_acme-challenge")  | .id')
    
    # Deleting records for CREATE_DOMAIN subdomain
    for RECORD_ID in $RECORDS; do
        echo -e "delete $RECORD_ID \n "
        curl -s -X POST "https://adm.tools/action/dns/record_delete/" \
            -H "Authorization: Bearer $AUTH_TOKEN" \
            -d "subdomain_id=$RECORD_ID"
    done
    
    # Adding new record
    ADD_RECORD=$(curl -s -X POST "https://adm.tools/action/dns/record_add/" \
        -H "Authorization: Bearer $AUTH_TOKEN" \
        -d "domain_id=$DOMAIN_ID&type=TXT&record=$CREATE_DOMAIN&data=$CERTBOT_VALIDATION&priority=0")
    
    # Checking for created record
    if ! echo "$ADD_RECORD" | grep -q '"result":true'; then
        echo "Failed to add DNS record for $CREATE_DOMAIN"
        exit 1
    fi
    
    # Waiting 5 minutes to spread changes
    sleep 300
    cleanup.sh
    #!/bin/bash
    
    # Bearer authentication
    AUTH_TOKEN="AdmToolsToken"
    
    # Definitions for subdomain
    CREATE_DOMAIN="_acme-challenge"
    
    # Getting domain id
    DOMAIN_ID=$(curl -s -X POST "https://adm.tools/action/get_id/" \
        -H "Authorization: Bearer $AUTH_TOKEN" \
        -d "name=$CERTBOT_DOMAIN&type=domain" | \
        grep -oP '(?<="domain_id":")[^"]+')
    
    if [ -z "$DOMAIN_ID" ]; then
        echo "Domain ID not found for $CERTBOT_DOMAIN"
        exit 1
    fi
    
    # Getting list of domain records for deleting
    RECORDS=$(curl -s -X POST "https://adm.tools/action/dns/records_list/" \
        -H "Authorization: Bearer $AUTH_TOKEN" \
        -d "domain_id=$DOMAIN_ID" | jq -r '.response.list[] | select(.record == "_acme-challenge")  | .id')
    
    # Deleting records for CREATE_DOMAIN subdomain
    for RECORD_ID in $RECORDS; do
        echo -e "delete $RECORD_ID \n "
        curl -s -X POST "https://adm.tools/action/dns/record_delete/" \
            -H "Authorization: Bearer $AUTH_TOKEN" \
            -d "subdomain_id=$RECORD_ID"
    done
  4. Для обоих скриптов установите права на выполнение (вместо /path/to/ используйте свой путь к скриптам):
    chmod 740 /path/to/authenticator.sh
    chmod 740 /path/to/cleanup.sh
  5. Выполните команду:
    certbot certonly --manual --preferred-challenges=dns --email admin@example.com --server https://acme-v02.api.letsencrypt.org/directory --agree-tos --manual-auth-hook /path/to/authenticator.sh --manual-cleanup-hook /path/to/cleanup.sh -d *.example.com 

    В команде используйте свои данные:

    • admin@example.com — почтовый ящик для получения информации о проекте Certbot.
    • *.example.com — доменное имя для выписки сертификата (с *. в начале).
  6. Скрипты выполняются не менее 5 минут. Если выполнение прошло неуспешно, то могла не успеть обновиться информация в системе DNS. При необходимости увеличте в первом скрипте значение в команде sleep.
  7. Созданные файлы сертификата будут расположены в каталоге вида /etc/letsencrypt/live/example.com/, где вместо example.com будет ваш домен, для которого был выписан сертификат. Certbot запланирует следующую выписку сертификата незадолго перед его окончанием с использованием тех же скриптов. Не перемещайте и не удаляйте их, если всё прошло успешно, и проверьте корректность последующей подачи запроса.
Содержание

    (2)

    Комментарии

    used.net
    А як щодо wildcard сертифікату?
    verliber
    Дякуємо за пропозицію, додамо інструкцію для створення wildcard сертифікату.