Nginx como proxy de reenvío para HTTPS

23

Si bien pude configurar con éxito nginx para el tráfico HTTP proxy (usando esta guía ), todos los intentos de proxy de las solicitudes HTTPS dieron como resultado el código 400 ( Solicitud incorrecta ).

Los registros de depuración de Nginx no fueron útiles en absoluto:

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"

¿Cuáles son estas CONNECTsolicitudes? ¿Es posible incluso realizar proxy_passsolicitudes HTTPS en nginx?

Actualizar

Necesito agregar que un servidor proxy es parte de mi kit de herramientas / flujo de trabajo de desarrollo web. Es una excelente manera de probar / depurar JavaScript del lado del cliente en un entorno de producción (usando reescrituras antes del proxy).

Además, el lenguaje de configuración de nginx es posiblemente un lenguaje de programación por derecho propio. Tiene variables!


fuente

Respuestas:

17

Parece que nginx no admite el modo proxy hacia adelante con SSL. Necesitarás usar algo como Squid en su lugar. Aquí hay un enlace con más explicaciones del autor de nginx: HTTPS y nginx como Forward Proxy.

Zorayr
fuente
1
¡Gracias! El hilo que vinculaste tiene 4 años, pero también me parece imposible.
Si necesita un proxy para la depuración, intente mitmproxy.
Zorayr
7

Solo para aclarar: como escribí en el feed de comentarios de mi blog, nginx no maneja las llamadas al método CONNECT que se utilizan para establecer una conexión TCP sin procesar a un host remoto a través de un proxy HTTP, lo cual tiene sentido, teniendo en cuenta que se supone que nginx no funciona como un proxy directo, simplemente funciona bastante bien para HTTP normal independientemente.

Nginx literalmente no tiene idea de qué hacer con esas llamadas a métodos, por eso los mensajes de error en los registros son bastante inútiles. Siempre me he encontrado usando Privoxy para HTTPS: http://www.privoxy.org/ - también es increíblemente fácil de configurar. Pero aún es imposible filtrar o destrozar el contenido de los relés HTTPS, porque las conexiones HTTPS se manejan con una conexión sin procesar a través del método CONNECT y el servidor no tiene idea de lo que está transmitiendo.

Magnus
fuente
2

Si no le importa compilar nginx desde la fuente, puede instalar ngx_http_proxy_connect_module . Lo siguiente funcionó para mí en Debian 9 "Stretch" en una Raspberry Pi (después de agregar las URL de deb-src a /etc/apt/sources.list e hice 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

Luego edite /usr/local/nginx/conf/nginx.confy haga que se vea así (he incluido un ejemplo de dominios que desea bloquear, que funciona con proxy SSL y no 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;
        }
    }
}

Entonces corre /usr/local/nginx/sbin/nginx. Coexistirá felizmente con el nginxpaquete de stock de Debian si también está ejecutando un servidor web de producción en el puerto 80 y no quiere arriesgarse a meterse con eso (pero asegúrese de iniciar la /usr/localversión por separado en el arranque); Alternativamente, con más configuración, puede ejecutar ambos servicios desde el nginx que ha compilado. Pero si configura su nginx compilado para que se ejecute en un puerto en el que su firewall permite el tráfico, tenga cuidado de tener que buscar manualmente las actualizaciones de seguridad de nginx ya que el sistema de paquetes de Debian ya no lo hará por usted.

Silas S. Brown
fuente
Tuve que ajustar algunos de los comandos, pero en general su respuesta funcionó para mí. ¡Muchas gracias!
Robert Reiz
0

Simplemente seguí las instrucciones de Silas S. Brown y pude compilar un binario Nginx que puede manejar el reenvío y SSL. Reuní todo en una imagen de Docker. El Dockerfile y la configuración están aquí en GitHub: https://github.com/reiz/nginx_proxy .

La imagen de Nginx Docker en este repositorio de Docker Hub puede manejar la conexión SSL y el reenvío: https://hub.docker.com/r/reiz/nginx_proxy/ .

Robert Reiz
fuente