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_passHTTPS-запросы в nginx?

Обновить

Необходимо добавить, что прокси-сервер является частью моего рабочего процесса / инструментария веб-разработки. Это отличный способ для тестирования / отладки клиентского JavaScript в производственной среде (используя переписывание перед прокси).

Кроме того, язык конфигурации nginx, возможно, сам по себе является языком программирования. У него есть переменные!

https  nginx  proxy 

Ответы:


17

Похоже, nginx не поддерживает режим прямого прокси с SSL. Вам нужно будет использовать что-то вроде Squid вместо этого. Вот ссылка с дополнительным объяснением от автора 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 «Растянуть» на Raspberry Pi (после того, как я добавил URL-адреса deb-src в /etc/apt/sources.list и выполнил обновление apt-get):

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

Я просто следовал инструкциям Сайласа С. Брауна и смог собрать двоичный файл Nginx, который может работать с пересылкой и SSL. Я собрал все вместе в образ Docker. Dockerfile и его конфигурация находятся здесь, на 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.