Как включить TLS при доступе к прокси-серверу в режиме http?

Я использую сервер Nginx в качестве обратного прокси. Он обслуживает как HTTP, так и HTTPS-трафик и отправляет вызовы на несколько HTTP-сайтов.

Недавно я хотел иметь возможность шифровать трафик между Nginx и базовым сервером. Nginx по-прежнему дешифрует HTTPS-трафик, который он получает из Интернета, как и раньше, но затем должен использовать HTTPS с другим сертификатом для доступа к базовому серверу.

Я начал менять конфигурацию, следуя официальной документации. Тем не мение, proxy_ssl on может быть установлен только в пределах stream уровень, а не http, Это подтверждается nginx -t который показывает для строки, содержащей proxy_ssl on; следующая ошибка:

Директива proxy_ssl здесь не разрешена [...]

Моя трудность заключается в том, что я использую Nginx для регистрации трафика, добавления заголовков и т. Д., Поэтому я должен использовать http, Если мое понимание верно, stream Уровень необходим, когда Nginx используется для прямой передачи трафика HTTPS, без возможности его расшифровки (т. е. SSL Pass-thru), что не в моем случае.

Могу ли я заставить Nginx подключаться через HTTPS к базовому серверу, все еще используя http уровень и все его преимущества, такие как регистрация и изменение заголовков?

Текущая конфигурация:

http {
    proxy_set_header ... # Logging and custom headers.

    ...

    upstream demo-failover {
        server demo1.example.com:443 weight=1000 max_fails=0;
        server demo2.example.com:443 backup;
    }

    server {
        listen 80 proxy_protocol;
        listen 443 ssl http2 proxy_protocol;
        server_name demo.example.com;

        # HTTPS configuration for public exchange (Internet <-> Nginx).
        ssl_certificate /.../fullchain.pem;
        ssl_certificate_key /.../privkey.pem;

        ssl_stapling on;
        ssl_stapling_verify on;

        # HTTPS configuration for private exchange (Nginx <-> underlying server).
        proxy_ssl on; # This is the line which is invalid.
        proxy_ssl_trusted_certificate /.../ca.pem;
        proxy_ssl_certificate /.../demo.pem;
        proxy_ssl_certificate_key /.../demo.key;
        proxy_ssl_verify on;
        proxy_ssl_verify_depth 2;
        proxy_ssl_session_reuse on;

        if ($scheme = http) {
            return 301 https://$server_name$request_uri;
        }

        location / {
            proxy_pass http://demo-failover;
            proxy_next_upstream error timeout invalid_header;
            proxy_connect_timeout 2;
            proxy_redirect off;
            proxy_http_version 1.1;
        }
    }
}

1 ответ

Решение

Нашел это.

Нет необходимости переключаться на streamи нет необходимости использовать proxy_ssl on,

Другой пример из официальной документации показывает, как использовать HTTPS при http уровень. Уловка (и это была моя ошибка, когда я пытался удалить proxy_ssl on и обнаружил, что Nginx пытается вызвать базовый сервер с помощью HTTP) proxy_pass значение. В моем случае я сохранил первоначальное значение:

proxy_pass http://demo-failover;

Вместо этого я должен был изменить это на https:

proxy_pass https://demo-failover;
#              ^
Другие вопросы по тегам