Назад | Перейти на главную страницу

Клиент Letsencrypt за обратным прокси-сервером Nginx

Итак, общая установка такова:

У меня есть сервер с общедоступным 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 в сценарии обратного прокси. Единственная разница в этом случае состоит в том, что вам также потребуется действующее соглашение о сертификате между серверной и интерфейсной машинами.