Nginx як прямий проксі для HTTPS


23

Хоча мені вдалося налаштувати nginx для проксі-трафіку HTTP (використовуючи це керівництво ), усі спроби проксі-запитів HTTPS призводили до коду 400 ( неправильний запит ).

Журнали налагодження Nginx взагалі не були корисними:

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"

Що це за CONNECTзапити? Чи можливо навіть proxy_passзапити HTTPS в nginx?

Оновлення

Потрібно додати, що проксі-сервер є частиною мого робочого процесу / інструментарію з веб-розробки. Це прекрасний спосіб перевірити / налагодити JavaScript на стороні клієнта у виробничому середовищі (використовуючи переписування перед проксі).

Також мова конфігурації nginx, можливо, є мовою програмування. Він має змінні!

https  nginx  proxy 

Відповіді:


17

Схоже, що nginx не підтримує режим прямого проксі з SSL. Вам потрібно буде використовувати щось на зразок кальмарів . Ось посилання з додатковими поясненнями від автора nginx: HTTPS та nginx як Forward Proxy.


1
Спасибі! Нитка, яку ви пов’язали, - 4 роки, але мені також здається, що це все ще неможливо.

Якщо вам потрібен проксі для налагодження, спробуйте mitmproxy.
Зорайр

7

Просто для уточнення: як я писав у стрічці коментарів свого блогу, nginx не обробляє дзвінки методу CONNECT, які використовуються для встановлення необмеженого TCP-з'єднання з віддаленим хостом через проксі-сервер HTTP - що має сенс, враховуючи, що nginx не повинен працює як прямий проксі-сервер, воно, як правило, працює досить добре для звичайного HTTP незалежно.

Nginx просто буквально не має уявлення, що робити з тими викликами методу, тому повідомлення про помилки в журналах є досить марними. Мені завжди доводилося використовувати privoxy для HTTPS: http://www.privoxy.org/ - це також шалено просто налаштувати. Але все ще неможливо фільтрувати або маніпулювати вмістом реле HTTPS, оскільки HTTPS-з'єднання обробляються з необробленим з'єднанням методом CONNECT, і сервер не має уявлення, що це ретрансляція.


2

Якщо ви не проти компілювати nginx з джерела, ви можете встановити ngx_http_proxy_connect_module . Наступне працювало для мене в Debian 9 "Stretch" на Raspberry Pi (після того, як я додав deb-src URL-адреси до /etc/apt/sources.list і зробив 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

Потім відредагуйте /usr/local/nginx/conf/nginx.confта зробіть це таким чином (я включив приклад доменів, які ви хочете заблокувати, який працює як з SSL, так і з не-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;
        }
    }
}

Потім бігайте /usr/local/nginx/sbin/nginx. Він буде цілком радісно співіснувати з nginxпакетом акцій Debian, якщо ви також запускаєте виробничий веб-сервер на порт 80 і не хочете ризикувати зіткнутися з цим (але обов'язково запускайте /usr/localверсію окремо під час завантаження); в іншому випадку, з більшою конфігурацією ви можете запустити обидва сервіси з nginx, який ви склали. Але якщо ви встановите збірний nginx для роботи на порту, на який ваш брандмауер дозволяє здійснювати трафік, будьте обережні, вам доведеться перевірити оновлення безпеки nginx вручну, оскільки система пакунків Debian більше не буде робити це для вас.


Мені довелося налаштувати деякі команди, але загалом ваша відповідь працювала на мене. Велике дякую!
Роберт Рейз

0

Я просто дотримувався вказівок Silas S. Brown і мені вдалося скласти бінарний файл Nginx, який може мати справу з переадресацією та SSL. Я поєднав все разом у зображення Докера. Докерфайл та конфігурація тут на GitHub: https://github.com/reiz/nginx_proxy .

Зображення Nginx Docker у цьому сховищі Docker Hub може працювати з підключенням та переадресацією SSL: https://hub.docker.com/r/reiz/nginx_proxy/ .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.