Получение сертификата Let's Encrypt для Proxmox VE

Пошаговое получение и автоматическое обновление доверенного TLS-сертификата Let's Encrypt для веб-интерфейса Proxmox VE.

По умолчанию веб-интерфейс Proxmox VE использует собственный сертификат, которому браузер не доверяет. Из-за этого при открытии панели появляется предупреждение о небезопасном соединении.

Proxmox VE поддерживает получение сертификатов Let's Encrypt через встроенный ACME-клиент.

В этой инструкции рассматривается только выпуск доверенного TLS-сертификата для веб-интерфейса Proxmox VE и проверка его автоматического обновления.

Подходит для: Proxmox VE 8 и 9
Уровень сложности: средний
Время выполнения: около 20 минут
Требуемый доступ: административные права в Proxmox VE и управление DNS-зоной домена

Что будет настроено

После выполнения инструкции:

  • узлу будет назначено корректное полное доменное имя;
  • DNS-запись будет указывать на Proxmox VE;
  • будет создана ACME-учётная запись;
  • будет настроена проверка домена;
  • будет выпущен сертификат Let's Encrypt;
  • будет проверен сертификат веб-интерфейса;
  • будет проверено автоматическое продление.

Что потребуется

Подготовьте:

  • доменное имя;
  • возможность изменять DNS-записи;
  • корректный hostname узла;
  • доступ к веб-интерфейсу и shell;
  • внешний доступ к порту 80 для HTTP challenge либо API DNS-провайдера для DNS challenge;
  • резервный доступ к консоли.

Пример доменного имени:

pve01.example.com

Используйте собственный домен.

Выбор способа проверки домена

Let's Encrypt должен подтвердить управление доменом.

В Proxmox VE можно использовать:

HTTP-01
DNS-01

HTTP-01

Let's Encrypt обращается к узлу по HTTP.

Требования:

  • публичная DNS-запись;
  • доступность узла из интернета;
  • открытый TCP-порт 80;
  • отсутствие блокировки challenge reverse proxy или firewall.

DNS-01

Proxmox создаёт специальную TXT-запись через API DNS-провайдера.

Преимущества:

  • порт 80 не требуется;
  • подходит для закрытого веб-интерфейса;
  • позволяет выпускать сертификат, даже если узел доступен только через VPN;
  • не требует публикации панели Proxmox в интернет.

Для административного интерфейса безопаснее использовать DNS-01, если DNS-провайдер поддерживается.

Проверка hostname

На узле:

hostnamectl

Покажите полное имя:

hostname -f

Ожидаемый результат:

pve01.example.com

Проверьте короткое имя:

hostname -s

Ожидаемый результат:

pve01

Проверка /etc/hostname

cat /etc/hostname

Обычно в файле хранится короткое имя:

pve01

Проверка /etc/hosts

cat /etc/hosts

Пример:

127.0.0.1 localhost
192.0.2.10 pve01.example.com pve01

Полное имя узла должно разрешаться в его management IP.

Проверьте:

getent hosts pve01.example.com

Проверка DNS

С узла:

dig +short pve01.example.com

Если dig отсутствует:

apt update
apt install -y dnsutils

Для публичного HTTP-01 DNS должен возвращать публичный IP, по которому Let's Encrypt сможет обратиться к узлу.

Для DNS-01 достаточно управления DNS-зоной.

Проверка обратного разрешения

getent hosts "$(hostname -f)"

Проверьте соответствие:

hostname -f
hostname -I

Ошибка hostname может повлиять не только на сертификат, но и на работу компонентов Proxmox VE.

Не переименовывайте кластерный узел без отдельного плана.

Проверка текущего сертификата

Через браузер откройте:

https://pve01.example.com:8006

Через CLI:

openssl s_client   -connect pve01.example.com:8006   -servername pve01.example.com   </dev/null 2>/dev/null |
openssl x509   -noout   -subject   -issuer   -dates

Собственный сертификат обычно имеет issuer, связанный с локальной CA Proxmox.

Создание резервной копии сертификатов

Создайте каталог:

mkdir -p /root/proxmox-cert-backup

Скопируйте текущие сертификаты:

cp -a   /etc/pve/local/pveproxy-ssl.pem   /etc/pve/local/pveproxy-ssl.key   /root/proxmox-cert-backup/   2>/dev/null

Также сохраните:

cp -a   /etc/pve/pve-root-ca.pem   /etc/pve/local/pve-ssl.pem   /etc/pve/local/pve-ssl.key   /root/proxmox-cert-backup/   2>/dev/null

Ограничьте права:

chmod 600 /root/proxmox-cert-backup/*

Создание ACME-учётной записи через веб-интерфейс

Откройте:

Datacenter → ACME

Перейдите на вкладку:

Accounts

Нажмите:

Add

Укажите:

Account Name: default
E-Mail: admin@example.com
Directory: Let's Encrypt V2

Примите условия использования.

Для первоначального теста можно выбрать staging directory, чтобы не попасть под rate limits.

Production и staging

Staging

Используется для проверки настройки.

Сертификат staging не будет считаться доверенным браузером.

Преимущества:

  • менее строгие лимиты;
  • безопасно для повторных тестов;
  • удобно при отладке DNS plugin.

Production

Выдаёт реальный доверенный сертификат.

Переходите на production только после успешного теста.

Создание ACME-учётной записи через CLI

Показать ACME-конфигурацию:

pvenode acme account list

Создать учётную запись:

pvenode acme account register default   admin@example.com

Команда запросит подтверждение условий сервиса.

Проверьте:

pvenode acme account list

Настройка HTTP-01

Для HTTP challenge откройте:

Node → System → Certificates

В разделе ACME выберите:

Add

Укажите домен:

pve01.example.com

Plugin:

Standalone

Standalone challenge временно использует порт 80.

Проверка порта 80

На узле:

ss -lntp |
grep ':80'

Если порт занят, определите процесс:

ss -lntp 'sport = :80'

Для HTTP-01 входящий TCP-порт 80 должен быть доступен Let's Encrypt.

Проверьте firewall:

pve-firewall status

Проверьте внешнюю доступность с другой сети:

curl -I http://pve01.example.com/

Ограничения HTTP-01

HTTP-01 не подойдёт, если:

  • узел находится за NAT без port forwarding;
  • порт 80 блокируется провайдером;
  • панель доступна только в локальной сети;
  • DNS указывает на reverse proxy;
  • используется split DNS без публичной записи;
  • firewall не разрешает внешний доступ.

В таких случаях используйте DNS-01.

Настройка DNS-01

Откройте:

Datacenter → ACME → Challenge Plugins

Нажмите:

Add

Выберите DNS-провайдера.

Укажите:

  • Plugin ID;
  • DNS API;
  • API credentials;
  • при необходимости DNS propagation delay.

Хранение API credentials

Используйте минимально необходимые права.

DNS API token должен разрешать изменение TXT-записей только нужной зоны, если провайдер поддерживает такие ограничения.

Не используйте:

  • master password;
  • полный account token;
  • токен управления всеми доменами;
  • открытый текст в документации;
  • публикацию credentials в Git.

Пример структуры DNS plugin

Поля зависят от DNS-провайдера.

Обычно требуются:

API Token
Account ID
Zone ID
API User
API Key

Используйте названия, показанные интерфейсом выбранного plugin.

DNS propagation delay

После создания TXT-записи она должна распространиться по DNS.

Если проверка запускается слишком быстро, установите задержку.

Пример:

30–120 секунд

Конкретное значение зависит от DNS-провайдера и authoritative servers.

Проверка TXT-записи

Во время challenge запись имеет имя:

_acme-challenge.pve01.example.com

Проверить:

dig TXT   _acme-challenge.pve01.example.com

Проверка через конкретный публичный resolver:

dig @1.1.1.1 TXT   _acme-challenge.pve01.example.com

Добавление домена к узлу

Откройте:

Node → System → Certificates

В разделе ACME нажмите:

Add

Укажите:

Domain: pve01.example.com
Challenge Type: DNS
Plugin: DNS_PLUGIN_ID

Сохраните.

Проверка ACME-конфигурации через CLI

Покажите конфигурацию узла:

pvenode config get

Найдите ACME-параметры:

pvenode config get |
grep -i acme

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

В веб-интерфейсе:

Node → System → Certificates

Нажмите:

Order Certificates Now

Подтвердите операцию.

Следите за журналом задачи.

Ожидаемый результат:

TASK OK

Выпуск через CLI

pvenode acme cert order

Для принудительного запуска при необходимости используются параметры команды, доступные в текущей версии.

Проверьте справку:

pvenode acme cert order --help

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

В веб-интерфейсе должен появиться сертификат ACME.

Через CLI:

openssl s_client   -connect pve01.example.com:8006   -servername pve01.example.com   </dev/null 2>/dev/null |
openssl x509   -noout   -subject   -issuer   -dates   -ext subjectAltName

Проверьте:

  • Subject;
  • Issuer;
  • Not Before;
  • Not After;
  • Subject Alternative Name.

Проверка файлов сертификата

ls -l   /etc/pve/local/pveproxy-ssl.pem   /etc/pve/local/pveproxy-ssl.key

Посмотреть срок:

openssl x509   -in /etc/pve/local/pveproxy-ssl.pem   -noout   -dates

Перезапуск pveproxy

Обычно Proxmox VE применяет сертификат автоматически.

При необходимости:

systemctl restart pveproxy

Проверьте:

systemctl status pveproxy --no-pager

Проверьте локально:

curl -kI https://127.0.0.1:8006/

Проверка в браузере

Откройте именно доменное имя:

https://pve01.example.com:8006

При открытии по IP:

https://192.0.2.10:8006

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

Проверка цепочки доверия

openssl s_client   -connect pve01.example.com:8006   -servername pve01.example.com   -showcerts   </dev/null

В конце проверьте:

Verify return code: 0 (ok)

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

Proxmox VE автоматически проверяет ACME-сертификаты и продлевает их до истечения.

Проверьте ACME-задачи:

journalctl --since "30 days ago" |
grep -i acme

Проверьте службы:

systemctl status pvescheduler --no-pager

ACME-задачи интегрированы в инфраструктуру Proxmox VE.

Ручная проверка продления

Покажите срок сертификата:

openssl x509   -in /etc/pve/local/pveproxy-ssl.pem   -noout   -enddate

Запустите обновление через интерфейс либо используйте CLI согласно доступным командам:

pvenode acme cert renew --help

Не выполняйте частые production-запросы без необходимости из-за rate limits.

Проверка staging перед production

Безопасный порядок:

  1. Создать staging account.
  2. Настроить challenge.
  3. Выпустить тестовый сертификат.
  4. Проверить успешный challenge.
  5. Удалить тестовую конфигурацию при необходимости.
  6. Создать production account.
  7. Выпустить доверенный сертификат.

Rate limits Let's Encrypt

Частые неудачные или повторные production-запросы могут привести к временным ограничениям.

Для отладки используйте staging.

Не запускайте выпуск в цикле.

Reverse proxy перед Proxmox VE

Если веб-интерфейс опубликован через reverse proxy, сертификат может завершаться на proxy.

В этом случае возможны два отдельных TLS-соединения:

Клиент → Reverse Proxy
Reverse Proxy → Proxmox VE

Встроенный ACME Proxmox нужен для второго соединения только если proxy проверяет сертификат backend.

Настройка reverse proxy является отдельной темой.

Split DNS

Для закрытого административного интерфейса можно использовать:

  • публичную DNS-зону для DNS-01;
  • внутренний DNS, возвращающий private IP;
  • сертификат на публично существующее DNS-имя;
  • доступ только через VPN.

Let's Encrypt не требует, чтобы сам сервис был публично доступен при DNS-01.

Сертификат с несколькими именами

К сертификату можно добавить несколько DNS-имён, если каждое можно подтвердить.

Пример:

pve01.example.com
proxmox.example.com

Но для узла лучше использовать одно основное стабильное FQDN.

Удаление ACME-сертификата

В веб-интерфейсе:

Node → System → Certificates

Выберите ACME-сертификат.

Удаляйте его только при наличии рабочего резервного сертификата и консольного доступа.

Через CLI доступны команды управления сертификатами:

pvenode acme cert --help

Возврат стандартного сертификата

Если ACME-сертификат повреждён, Proxmox VE может пересоздать стандартные сертификаты.

Проверьте документацию своей версии и доступные команды:

pvecm updatecerts --help

Перед выполнением создайте резервную копию /etc/pve/local.

Не удаляйте файлы сертификатов вручную без плана восстановления.

Типичные проблемы

ACME не может подтвердить HTTP-01

Проверьте:

dig +short pve01.example.com
ss -lntp |
grep ':80'

Проверьте NAT, firewall и внешний доступ.

DNS-01 не видит TXT-запись

Проверьте:

dig @1.1.1.1 TXT   _acme-challenge.pve01.example.com

Увеличьте propagation delay.

Проверьте права API token.

Ошибка invalid credentials

Пересоздайте DNS API token с минимально достаточными правами.

Проверьте формат полей plugin.

Сертификат выпущен, но браузер показывает старый

Перезапустите:

systemctl restart pveproxy

Очистите TLS-сессию браузера или откройте приватное окно.

Проверьте сертификат через openssl.

Браузер показывает name mismatch

Открывайте панель по FQDN, указанному в Subject Alternative Name.

Не используйте IP-адрес.

После смены hostname ACME перестал работать

Проверьте:

  • /etc/hostname;
  • /etc/hosts;
  • DNS;
  • имя узла в Proxmox;
  • ACME domains;
  • кластерную конфигурацию.

Переименование узла Proxmox VE требует отдельного плана.

Продление не выполняется

Проверьте:

  • DNS credentials;
  • доступ к Let's Encrypt;
  • время узла;
  • pvescheduler;
  • журнал ACME;
  • срок сертификата.

Безопасный порядок настройки

  1. Проверить FQDN.
  2. Проверить /etc/hosts.
  3. Проверить DNS.
  4. Создать резервную копию сертификатов.
  5. Выбрать HTTP-01 или DNS-01.
  6. Создать staging ACME account.
  7. Проверить challenge.
  8. Создать production account.
  9. Выпустить сертификат.
  10. Проверить его через openssl.
  11. Проверить вход по FQDN.
  12. Проверить автоматическое продление.

Быстрый набор команд

Проверить FQDN:

hostname -f
getent hosts "$(hostname -f)"

Проверить DNS:

dig +short pve01.example.com

Проверить текущий сертификат:

openssl s_client   -connect pve01.example.com:8006   -servername pve01.example.com   </dev/null 2>/dev/null |
openssl x509 -noout -subject -issuer -dates

Показать ACME accounts:

pvenode acme account list

Заказать сертификат:

pvenode acme cert order

Итог

После выполнения инструкции:

  • проверены hostname и DNS;
  • создана ACME-учётная запись;
  • настроен HTTP-01 или DNS-01 challenge;
  • выпущен сертификат Let's Encrypt;
  • проверены имя, цепочка и срок действия;
  • проверено применение сертификата в pveproxy;
  • рассмотрено автоматическое продление.

Для административного интерфейса Proxmox VE предпочтительно использовать DNS-01 и ограничивать сетевой доступ к панели через VPN или management-сеть.

← Предыдущая статья Настройка двухфакторной аутентификации в Proxmox VE Следующая статья → Импорт существующего диска qcow2 или VMDK в Proxmox VE