Nginx come proxy forward per HTTPS


23

Mentre sono stato in grado di configurare correttamente nginx per il proxy del traffico HTTP (usando questa guida ), tutti i tentativi di proxy delle richieste HTTPS hanno portato al codice 400 ( Bad Request ).

I log di debug di Nginx non sono stati affatto utili:

2013/06/05 14:38:33 [info] 74946#0: *589
    client sent invalid request while reading client request line, client: 127.0.0.1,
    server: google.com, request: "CONNECT google.com:443 HTTP/1.1"

Quali sono queste CONNECTrichieste? È possibile anche proxy_passrichieste HTTPS in nginx?

Aggiornare

Devo aggiungere che un server proxy fa parte del mio flusso di lavoro / toolkit di sviluppo web. È un ottimo modo per testare / eseguire il debug di JavaScript lato client nell'ambiente di produzione (utilizzando riscritture prima del proxy).

Anche il linguaggio di configurazione di nginx è probabilmente un linguaggio di programmazione a sé stante. Ha variabili!

https  nginx  proxy 

Risposte:


17

Sembra che nginx non supporti la modalità proxy forward con SSL. Dovrai invece usare qualcosa come Squid . Ecco un link con ulteriori spiegazioni dell'autore di nginx: HTTPS e nginx come Forward Proxy.


1
Grazie! Il thread che hai collegato ha 4 anni, ma mi sembra anche che sia ancora impossibile.

Se hai bisogno di un proxy per il debug, prova mitmproxy.
Zorayr,

7

Solo per chiarire: come ho scritto nel feed di commenti del mio blog, nginx non gestisce le chiamate al metodo CONNECT che vengono utilizzate per stabilire una connessione TCP non elaborata a un host remoto tramite un proxy HTTP - il che ha senso, considerando che nginx non dovrebbe funziona come proxy forward, funziona abbastanza bene per il normale HTTP a prescindere.

Nginx non ha letteralmente idea di cosa fare con quelle chiamate di metodo, ecco perché i messaggi di errore nei registri sono piuttosto inutili. Mi sono sempre trovato a usare privoxy per HTTPS: http://www.privoxy.org/ - è anche incredibilmente facile da configurare. Ma è ancora impossibile filtrare o manipolare il contenuto dei relè HTTPS, poiché le connessioni HTTPS vengono gestite con una connessione non elaborata tramite il metodo CONNECT e il server non ha idea di cosa stia trasmettendo.


2

Se non ti dispiace compilare nginx dal sorgente, potresti installare ngx_http_proxy_connect_module . Quanto segue ha funzionato per me in Debian 9 "Stretch" su un Raspberry Pi (dopo aver aggiunto gli URL deb-src a /etc/apt/sources.list e fatto apt-get update):

cd /tmp &&
apt-get source nginx &&
git clone https://github.com/chobits/ngx_http_proxy_connect_module &&
cd nginx-* &&
patch -p1 < ../ngx_http_proxy_connect_module/proxy_connect.patch &&
sudo apt-get install libpcre3-dev &&
./configure --add-module=/tmp/ngx_http_proxy_connect_module &&
make && sudo make install

Quindi modifica /usr/local/nginx/conf/nginx.confe fai in modo che appaia (ho incluso un esempio di domini che vuoi bloccare, che funziona sia con proxy SSL che non SSL):

user www-data;
worker_processes auto;
events { }
http {
    server_names_hash_bucket_size 128;
    server {
        listen       8888;
        server_name  spam.example.com *.spam.example.com;
        server_name  spam2.example.com *.spam2.example.com;
        access_log off;
        return 404;
    }
    server {
        listen       8888;
        server_name ~.+;
        proxy_connect;
        proxy_max_temp_file_size 0;
        resolver 8.8.8.8;
        location / {
           proxy_pass http://$http_host;
           proxy_set_header Host $http_host;
        }
    }
}

Quindi corri /usr/local/nginx/sbin/nginx. Abbastanza felicemente coesisterà con il nginxpacchetto di stock di Debian se stai anche eseguendo un webserver di produzione sulla porta 80 e non vuoi rischiare di rovinarlo (ma assicurati di avviare la /usr/localversione separatamente all'avvio); in alternativa, con più configurazioni potresti eseguire entrambi i servizi dalla nginx che hai compilato. Ma se imposti il ​​tuo nginx compilato per l'esecuzione su una porta a cui il tuo firewall consente il traffico, fai attenzione che dovresti controllare manualmente gli aggiornamenti di sicurezza di nginx poiché il sistema di pacchetti Debian non lo farà più per te.


Ho dovuto modificare alcuni dei comandi, ma nel complesso la tua risposta ha funzionato per me. Grazie molto!
Robert Reiz,

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.