Перейти к основному контенту

Выпуск и установка Let’s Encrypt

intro-release-installation-Lets-Encrypt-planetahost.png

Введение

SSL-сертификат (TLS) обеспечивает защищённое HTTPS-соединение между сервером и браузером пользователя. HTTPS защищает данные, повышает доверие посетителей, улучшает SEO и корректную работу браузеров.

Let’s Encrypt — бесплатный центр сертификации, который выпускает SSL-сертификаты сроком действия 90 дней с возможностью автоматического продления.

Для работы используется Certbot - официальный клиент Let’s Encrypt.

Подготовка перед установкой

Перед установкой убедитесь, что выполнены следующие условия:

  1. Доменное имя
    Домен должен быть зарегистрирован и указывать на IP сервера через DNS-запись типа A (или AAAA для IPv6).

  2. Прямое подключение домена к серверу (без прокси)
    На момент установки домен не должен работать через прокси или CDN (например, Cloudflare в режиме Proxied).
    DNS-запись должна быть в режиме DNS only, чтобы Let’s Encrypt мог обратиться к серверу по порту 80 напрямую.

  3. Операционная система Linux
    Поддерживаются Ubuntu и Debian.

  4. Установленный веб-сервер

    • Nginx
    • Apache
      Сервер должен быть запущен и отвечать по порту 80.
  5. Открытые порты

    • 80/tcp — проверка домена
    • 443/tcp — HTTPS
  6. Root-доступ или права sudo

Обновление системы

Перед установкой обновите пакеты:

sudo apt update && sudo apt upgrade -y

Установка Certbot

Для Nginx
sudo apt install certbot python3-certbot-nginx -y
Для Apache
sudo apt install certbot python3-certbot-apache -y

Получение SSL-сертификата

В примерах в инструкции будет использоваться домен example.com и www.example.com. Обязательно замените их на свои реальные при настройке.

Для Nginx
sudo certbot --nginx -d example.com -d www.example.com
Для Apache
sudo certbot --apache -d example.com -d www.example.com

Во время выполнения Certbot:

  • запросит контактный e-mail;
  • предложит принять условия использования;
  • предложит включить редирект HTTP → HTTPS (рекомендуется).

После завершения сертификат будет автоматически установлен и подключён к веб-серверу.

Автоматическое продление сертификатов

Certbot настраивает продление через systemd-таймер. Проверка работы:

sudo certbot renew --dry-run

Проверка установленных сертификатов

sudo certbot certificates

Показывает список доменов и срок действия сертификатов.

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

Проблема Возможная причина Решение
Timeout при генерации SSL Порт 80 закрыт или недоступен Откройте порт в брандмауэре
Domain not found DNS A-запись не настроена Проверьте DNS записи домена
Permission denied Нет прав Запустите с sudo
Сертификат не применился Автонастройка не сработала Вручную внесите SSL в конфигурацию сервера

Режим standalone

Режим standalone используется, если веб-сервер временно не запущен или не настроен:

sudo certbot certonly --standalone -d example.com

На время выполнения порт 80 должен быть свободен. Веб-сервер необходимо временно остановить:

sudo systemctl stop nginx
sudo certbot certonly --standalone -d example.com
sudo systemctl start nginx

Сертификаты всегда сохраняются в каталоге:

/etc/letsencrypt/live/example.com/

В этом каталоге находятся символические ссылки на актуальные версии сертификатов:

  • fullchain.pem - полный SSL-сертификат (сертификат + цепочка)

  • privkey.pem - приватный ключ

  • cert.pem - сертификат домена

  • chain.pem - цепочка доверия

Именно эти пути указываются в конфигурации Nginx или Apache.

Пример подключения сертификата в Nginx:

ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

Для Apache:

SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem

Фактические файлы версий находятся в:

/etc/letsencrypt/archive/example.com/

Certbot автоматически обновляет символические ссылки в live/.

Выпуск сертификата через DNS

Если домен работает через прокси или CDN (например, Cloudflare в режиме Proxied), HTTP-01 challenge не проходит. В этом случае можно использовать DNS-01 challenge:

sudo certbot certonly --manual --preferred-challenges=dns -d example.com -d www.example.com

Как будет происходить процесс:

  1. Certbot предложит добавить TXT-запись в DNS для проверки владения доменом.
  2. Нужно добавить указанную TXT-запись в панель управления DNS и дождаться её применения.
  3. После проверки Certbot выпустит сертификат и сохранит его в /etc/letsencrypt/live/example.com/.

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

Использование acme.sh для выпуска SSL

acme.sh - лёгкий ACME-клиент для автоматического выпуска и продления сертификатов Let’s Encrypt и других CA. Подходит для сайтов за прокси/CDN с поддержкой DNS-01 challenge.

Этот скрипт и способ работы через acme.sh с Cloudflare предназначены только для опытных пользователей. Для работы требуется действующий Cloudflare API Token и доступ к аккаунту. Не рекомендуется использовать без понимания принципов ACME и работы с DNS-записями.

Ниже мы сделали скрипт, который может:

  1. использует acme.sh;
  2. работает с Cloudflare API для DNS-01 challenge;
  3. автоматически выпускает сертификат;
  4. устанавливает его в стандартную директорию /etc/letsencrypt/live/example.com/;
  5. обеспечивает автоматическое продление через встроенный cron acme.sh.

Код скрипта:

#!/bin/bash
# Скрипт для автоматического выпуска и обновления сертификата через acme.sh с Cloudflare

# --- Настройки ---
DOMAIN="example.com"           # Ваш домен
SUBDOMAINS=("example.com" "www.example.com")  # Поддомены
CERT_DIR="/etc/letsencrypt/live/$DOMAIN"     # Куда ставить сертификат
CF_TOKEN="ВАШ_CLOUDFLARE_API_TOKEN"
CF_ACCOUNT_ID="ВАШ_CLOUDFLARE_ACCOUNT_ID"

# --- Установка acme.sh если не установлен ---
if ! command -v acme.sh &>/dev/null; then
    echo "[INFO] Установка acme.sh..."
    curl https://get.acme.sh | sh
    source ~/.bashrc
fi

# --- Экспорт переменных для Cloudflare API ---
export CF_Token="$CF_TOKEN"
export CF_Account_ID="$CF_ACCOUNT_ID"

# --- Подготовка списка доменов ---
DOMAIN_ARGS=""
for sub in "${SUBDOMAINS[@]}"; do
    DOMAIN_ARGS="$DOMAIN_ARGS -d $sub"
done

# --- Выпуск/обновление сертификата через DNS-01 challenge ---
echo "[INFO] Выпуск сертификата для $DOMAIN через DNS-01..."
acme.sh --issue --dns dns_cf $DOMAIN_ARGS --home ~/.acme.sh

# --- Установка сертификата в стандартную директорию ---
echo "[INFO] Установка сертификата в $CERT_DIR..."
mkdir -p "$CERT_DIR"
acme.sh --install-cert -d "$DOMAIN" \
    --key-file "$CERT_DIR/privkey.pem" \
    --fullchain-file "$CERT_DIR/fullchain.pem" \
    --reloadcmd "systemctl reload nginx"   # Перезагрузка веб-сервера после обновления

# --- Проверка cron (acme.sh сам добавляет автоматическое продление) ---
echo "[INFO] Проверка автоматического продления..."
acme.sh --upgrade --auto-upgrade

echo "[INFO] Готово! Сертификат установлен и будет автоматически продлеваться."

Как использовать скрипт:

1) Сохраните скрипт, например, как acme_cf.sh.

2) Сделайте его исполняемым:

chmod +x acme_cf.sh

3) Укажите домен, поддомены, CF_TOKEN и CF_ACCOUNT_ID.

4) Запустите скрипт:

sudo ./acme_cf.sh

После успешного выполнения сертификаты появятся в /etc/letsencrypt/live/example.com/.

acme.sh автоматически создаёт cron-задачу для продления сертификатов, так что вручную продлевать их не нужно.

Итог

Мы успешно выпустили SSL-сертификат Let’s Encrypt, настроили его на веб-сервере и проверили работу сайта по HTTPS. Сертификаты будут автоматически продлеваться, а при необходимости можно включить редирект с HTTP на HTTPS для полного перехода на защищённое соединение.