LetsEncrypt: Несколько IP-адресов в одном домене

Несколько IP адресов на одном домене — проблема и её решение

Довольно распространенная проблема выпуска бесплатного LetsEncrypt сертификата для домена к имени которого привязано несколько IP адресов может быть решена простым копированием сертификата, теоретически…
Но на практике это не работает, давайте разберемся, почему перевыпуск сертификата завершается ошибкой

Failed to renew certificate domain-name  with error: Some challenges have failed. 
All simulated renewals failed. The following certificates could not be renewed:

У меня было добавлено 2 IP-адреса к одному и тому же домену. Когда Certbot запускается на сервере A и когда Letsencrypt разрешает домен и получает адрес сервера B, проверка завершается неудачей, поскольку certbot для проверки сертификата не запущен на сервере B. Всё дело в принципе работы сервиса.

Работа LetsEncrypt вкратце

Когда certbot запускается с apache или nginx подключаемый модуль certbot запускает фиктивный веб-сервер с файлом acme-challenge, так что, когда letsencypt хочет проверить домен и связаться с сервером, этот файл challenge обслуживается certbot. После проверки фиктивный сервер уничтожается вместе с файлами запроса, генерируется новый сертификат и сохраняется на сервере.

Решение

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

domain-name/.well-known/acme-challenge Для sud-domain/.well-known/acme-challenge
RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain-name
RewriteRule ^/\.well-known/ http://sub.domain-name%{REQUEST_URI} [R=301,L]

Так выглядит правило перезаписи для файла apache .htaccess. Таким образом, проверка выполняется на одном сервере, который получает IP-адрес поддомена. Осталось написать скрипт для копирования сертификатов на остальные серверы и добавьте его в качестве postscript после обновления сертификата.

Поделитесь своими мыслями, оставьте комментарий: