Solicitações HTTPS de proxy para um back-end HTTP com NGINX

30

Eu tenho o nginx configurado para ser meu servidor web visível externamente, que fala com um back-end por HTTP.

O cenário que quero alcançar é:

  1. O cliente faz uma solicitação HTTP para o nginx, que é redirecionado para a mesma URL, mas através de HTTPS
  2. solicitação de proxies nginx sobre HTTP para o back-end
  3. O nginx recebe resposta do back-end por HTTP.
  4. O nginx passa isso de volta ao cliente através de HTTPS

Minha configuração atual (onde o back-end está configurado corretamente) é:

servidor {
        ouça 80;
        server_name localhost;

        localização ~. * {
            proxy_pass http: // back-end;
            proxy_redirect http: // back-end https: // $ host;
            proxy_set_header Host $ host;
            }
        }

Meu problema é que a resposta ao cliente (etapa 4) é enviada por HTTP, não por HTTPS. Alguma ideia?

Mike
fonte

Respostas:

6

O tipo de proxy que você está tentando configurar é chamado de proxy reverso. Uma rápida pesquisa pelo proxy reverso nginx me deu esta página:

http://intranation.com/entries/2008/09/using-nginx-reverse-proxy/

Além de adicionar alguns recursos úteis, como um cabeçalho X-Forwarded-For (que dará visibilidade ao seu aplicativo no IP de origem real), ele especificamente:

proxy_redirect off

Boa sorte! :)

Kyle Smith
fonte
1
Obrigado pela sua resposta - o link foi realmente muito útil. Acho que resolvi meu problema dividindo-o - configurei um redirecionamento para todas as solicitações HTTP na porta 80 para HTTPS na porta 443. Em seguida, configurei um novo servidor na configuração para 443. Anteriormente, estava tentando fazer isso tudo mesmo lugar.
Mike
35

Estou usando a seguinte configuração na produção

server {
    listen xxx.xxx.xxx.xxx:80;
    server_name www.example.net;

    rewrite ^(.*) https://$server_name$1 permanent;
}

server {
    listen xxx.xxx.xxx.xxx:443;
    server_name www.example.net;

    root   /vhosts/www.example.net;

    ssl                  on;
    ssl_certificate      /etc/pki/nginx/www.example.net.crt;
    ssl_certificate_key  /etc/pki/nginx/www.example.net.key;

    ssl_prefer_server_ciphers on;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;

    # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
    ssl_dhparam /etc/pki/nginx/dh2048.pem;

    # intermediate configuration. tweak to your needs.
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
    }
}
ALex_hha
fonte
A adição de +1 proxy_set_header X-Forwarded-Proto https;fez o truque para mim.
Faisal Feroz
-3
server {

    listen 80;
    server_name www.example.net example.net;

   rewrite ^/(.*)$ https://$host$request_uri? permanent; 
}

server {
  listen 443;
  server_name www.example.net example.net;
  .....................
Zhang Jun
fonte