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 сертифікату.