Proxy HTTPS richiede a un back-end HTTP con NGINX


30

Ho nginx configurato per essere il mio server web visibile esternamente che parla con un backend su HTTP.

Lo scenario che voglio realizzare è:

  1. Il client invia una richiesta HTTP a nginx che viene reindirizzato allo stesso URL ma su HTTPS
  2. richiesta proxy nginx su HTTP al backend
  3. nginx riceve risposta dal backend su HTTP.
  4. nginx lo restituisce al client tramite HTTPS

La mia configurazione attuale (dove il backend è configurato correttamente) è:

server {
        ascolta 80;
        nome_server localhost;

        posizione ~. * {
            proxy_pass http: // backend;
            proxy_redirect http: // backend https: // $ host;
            proxy_set_header Host $ host;
            }
        }

Il mio problema è che la risposta al client (passaggio 4) viene inviata tramite HTTP e non HTTPS. Qualche idea?

Risposte:


6

Il tipo di proxy che si sta tentando di impostare è chiamato proxy inverso. Una rapida ricerca di nginx proxy inverso mi ha portato questa pagina:

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

Oltre ad aggiungere alcune utili funzionalità come un'intestazione X-Forwarded-For (che darà visibilità alla tua app nell'effettivo IP di origine), in particolare:

proxy_redirect off

In bocca al lupo! :)


1
Grazie per la tua risposta - il link è stato davvero molto utile. Penso di aver risolto il mio problema suddividendolo: ho configurato un reindirizzamento per tutte le richieste HTTP dalla porta 80 a HTTPS sulla porta 443. Ho quindi configurato un nuovo server nella configurazione per 443. In precedenza stavo provando a fare tutto questo stesso luogo.
Mike,

35

Sto usando la seguente configurazione in produzione

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;
    }
}

+1 L'aggiunta ha proxy_set_header X-Forwarded-Proto https;fatto il trucco per me.
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;
  .....................
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.