Como habilitar o TLS ao acessar um servidor proxy no modo http?

1

Estou usando um servidor Nginx como um proxy reverso. Ele serve tráfego HTTP e HTTPS e despacha as chamadas para vários sites somente HTTP.

Recentemente, eu queria ser capaz de criptografar o tráfego entre o Nginx e o servidor subjacente. O Nginx ainda descriptografa o tráfego HTTPS que recebe da Internet como antes, mas deve usar HTTPS com um certificado diferente para acessar o servidor subjacente.

Eu comecei a mudar a configuração, seguindo a documentação oficial . No entanto, proxy_ssl on pode ser definido apenas dentro de um stream level e não http . Isso é confirmado por nginx -t , que mostra a linha contendo proxy_ssl on; o seguinte erro:

"proxy_ssl" directive is not allowed here [...]

Minha dificuldade é que estou usando o Nginx para registrar o tráfego, adicionar cabeçalhos, etc., então tenho que usar http . Se meu entendimento estiver correto, stream level é necessário quando o Nginx é usado para transmitir o tráfego HTTPS diretamente, sem a capacidade de descriptografá-lo (por exemplo, SSL Pass-thru), o que não é meu caso.

Posso fazer o Nginx se conectar por meio de HTTPS ao servidor subjacente enquanto ainda usa o nível http e todos os seus benefícios, como o registro em log e a alteração de cabeçalhos?

Configuração atual:

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;
        }
    }
}
    
por Arseni Mourzenko 24.01.2018 / 01:19

1 resposta

1

Encontrado.

Não há necessidade de mudar para stream e não há necessidade de usar proxy_ssl on .

Um exemplo diferente da documentação oficial mostra como usar o HTTPS em http level. O truque (e esse foi meu erro quando tentei remover proxy_ssl on e me encontrei com o Nginx tentando chamar o servidor subjacente usando HTTP) é o valor proxy_pass . No meu caso, mantive o valor original:

proxy_pass http://demo-failover;

Em vez disso, eu deveria ter alterado para https :

proxy_pass https://demo-failover;
#              ^
    
por 24.01.2018 / 01:38

Tags