Итак, общая установка такова:
У меня есть сервер с общедоступным IP-адресом (я назову его клиентской машиной), на котором работает Nginx и обслуживает несколько веб-страниц, защищенных сертификатами Letsencrypt.
Теперь мы хотим добавить новую машину (назовем ее серверной машиной), на которой запущено другое веб-приложение и несколько других приложений, которые должны быть защищены сертификатами SLL от Letsencrypt. Веб-приложение обслуживается Apache и находится на собственном поддомене за обратным прокси-сервером на машине внешнего интерфейса.
Обычно я бы просто отключил SSL на внешнем компьютере и разговаривал по протоколу HTTP с сервером, но в данном случае это невозможно. Бэкэнд-машина должна быть той, у которой есть сертификаты SSL для поддомена. Поэтому я подумал, что просто настрою обратный прокси, который не добавляет никаких заголовков для перенаправления всех запросов в этот домен на внутренний сервер. Моя конфигурация Nginx на машине внешнего интерфейса выглядит так:
#sub.domain.com
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name sub.domain.com;
error_log /var/log/nginx/subdomain.error.log;
location / {
# Fix the “It appears that your reverse proxy set up is broken" error.
proxy_pass https://192.168.11.3;
proxy_ssl_verify off;
proxy_read_timeout 90;
proxy_redirect https://192.168.11.3 https://sub.domain.com;
}
}
server {
listen 80;
listen [::]:80;
server_name sub.domain.com;
location / {
proxy_pass http://192.168.11.3;
proxy_read_timeout 90;
proxy_redirect http://192.168.11.3 http://sub.domain.com;
}
}
Затем я попытался запросить сертификат у Letsencrypt на бэкэнд-машине с помощью функции «временный веб-сервер» из letsencrypt, но это дает следующую ошибку:
Domain: sub.domain.com
Type: unauthorized
Detail: Incorrect validation certificate for TLS-SNI-01 challenge.
Requested
{LONG TOKEN REMOVED}.acme.invalid
from XXX.XXX.XXX.XXX:443. Received 2 certificate(s), first
certificate had names "othersub.domain.com"
To fix these errors, please make sure that your domain name was
entered correctly and the DNS A record(s) for that domain
contain(s) the right IP address.
Итак, мой вопрос: как я могу заставить это работать? Я думал, что обратный прокси-сервер внешнего интерфейса должен иметь возможность пересылать запрос, который letsencrypt делает на веб-сервер для проверки клиента, но, похоже, это не работает. Любая помощь приветствуется!
Вам все равно нужно будет завершить SSL-запрос на машине внешнего интерфейса nginx, установив сертификат для sub.domain.com на машине внешнего интерфейса. Точно так же, как если бы вы говорили http в сценарии обратного прокси. Единственная разница в этом случае состоит в том, что вам также потребуется действующее соглашение о сертификате между серверной и интерфейсной машинами.