Выпуск и установка Let’s Encrypt
Введение
SSL-сертификат (TLS) обеспечивает защищённое HTTPS-соединение между сервером и браузером пользователя. HTTPS защищает данные, повышает доверие посетителей, улучшает SEO и корректную работу браузеров.
Let’s Encrypt — бесплатный центр сертификации, который выпускает SSL-сертификаты сроком действия 90 дней с возможностью автоматического продления.
Для работы используется Certbot - официальный клиент Let’s Encrypt.
Подготовка перед установкой
Перед установкой убедитесь, что выполнены следующие условия:
-
Доменное имя
Домен должен быть зарегистрирован и указывать на IP сервера через DNS-запись типа A (или AAAA для IPv6). -
Прямое подключение домена к серверу (без прокси)
На момент установки домен не должен работать через прокси или CDN (например, Cloudflare в режиме Proxied).
DNS-запись должна быть в режиме DNS only, чтобы Let’s Encrypt мог обратиться к серверу по порту 80 напрямую. -
Операционная система Linux
Поддерживаются Ubuntu и Debian. -
Установленный веб-сервер
- Nginx
- Apache
Сервер должен быть запущен и отвечать по порту 80.
-
Открытые порты
80/tcp— проверка домена443/tcp— HTTPS
-
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
Как будет происходить процесс:
- Certbot предложит добавить TXT-запись в DNS для проверки владения доменом.
- Нужно добавить указанную TXT-запись в панель управления DNS и дождаться её применения.
- После проверки 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-записями.
Ниже мы сделали скрипт, который может:
- использует acme.sh;
- работает с Cloudflare API для DNS-01 challenge;
- автоматически выпускает сертификат;
- устанавливает его в стандартную директорию /etc/letsencrypt/live/example.com/;
- обеспечивает автоматическое продление через встроенный 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 для полного перехода на защищённое соединение.
