Nginx là proxy chuyển tiếp cho HTTPS


23

Mặc dù tôi có thể định cấu hình thành công nginx thành lưu lượng HTTP proxy (sử dụng hướng dẫn này ), nhưng tất cả các nỗ lực đối với các yêu cầu HTTPS proxy đều dẫn đến mã 400 ( Yêu cầu không hợp lệ ).

Nhật ký gỡ lỗi Nginx không hữu ích chút nào:

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"

Những CONNECTyêu cầu này là gì? Thậm chí có thể proxy_passyêu cầu HTTPS trong nginx không?

Cập nhật

Cần thêm rằng một máy chủ proxy là một phần của quy trình / bộ công cụ phát triển web của tôi. Đó là một cách tuyệt vời để kiểm tra / gỡ lỗi JavaScript phía máy khách trong môi trường sản xuất (sử dụng viết lại trước proxy).

Ngoài ra, ngôn ngữ cấu hình của nginx được cho là ngôn ngữ lập trình theo đúng nghĩa của nó. Nó có biến!

https  nginx  proxy 

Câu trả lời:


17

Có vẻ như nginx không hỗ trợ chế độ proxy chuyển tiếp với SSL. Bạn sẽ cần phải sử dụng một cái gì đó như Mực thay thế. Đây là một liên kết với lời giải thích nhiều hơn từ tác giả của nginx: HTTPS và nginx là Proxy chuyển tiếp.


1
Cảm ơn! Chủ đề bạn liên kết là 4 năm, nhưng đối với tôi nó dường như vẫn không thể.

Nếu bạn cần một proxy để gỡ lỗi, hãy thử dùng mitmproxy.
Zorayr

7

Chỉ cần làm rõ: như tôi đã viết trên nguồn cấp dữ liệu nhận xét trên blog của mình, nginx không xử lý các cuộc gọi phương thức CONNECT được sử dụng để thiết lập kết nối TCP thô đến máy chủ từ xa thông qua proxy HTTP - điều này có nghĩa, xem xét rằng nginx không được phép hoạt động như một proxy chuyển tiếp, nó chỉ hoạt động khá tốt cho HTTP thông thường bất kể.

Nginx thực sự không biết phải làm gì với các cuộc gọi phương thức đó, đó là lý do tại sao các thông báo lỗi trong nhật ký khá vô dụng. Tôi luôn thấy mình sử dụng privateoxy cho HTTPS: http://www.privoxy.org/ - nó cũng rất dễ cài đặt. Nhưng vẫn không thể lọc hoặc xử lý nội dung của rơle HTTPS, vì các kết nối HTTPS được xử lý với kết nối thô thông qua phương thức CONNECT và máy chủ không biết nó đang chuyển tiếp gì.


2

Nếu bạn không nhớ biên dịch nginx từ nguồn, bạn có thể cài đặt ngx_http_proxy_connect_module . Phần sau hoạt động với tôi trong Debian 9 "Stretch" trên Raspberry Pi (sau khi tôi đã thêm URL deb-src vào /etc/apt/source.list và đã cập nhật 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

Sau đó chỉnh sửa /usr/local/nginx/conf/nginx.confvà làm cho nó trông như thế này (Tôi đã bao gồm một ví dụ về các tên miền bạn muốn chặn, hoạt động với cả proxy SSL và proxy không 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;
        }
    }
}

Sau đó chạy /usr/local/nginx/sbin/nginx. Nó sẽ khá vui vẻ cùng tồn tại với nginxgói chứng khoán của Debian nếu bạn cũng đang chạy một máy chủ web sản xuất trên cổng 80 và không muốn mạo hiểm với điều đó (nhưng hãy đảm bảo khởi động /usr/localphiên bản riêng khi khởi động); cách khác, với cấu hình nhiều hơn, bạn có thể chạy cả hai dịch vụ từ nginx bạn đã biên dịch. Nhưng nếu bạn cài đặt nginx đã biên dịch của mình để chạy trên một cổng mà tường lửa của bạn cho phép lưu lượng truy cập, hãy cẩn thận, bạn phải kiểm tra thủ công các bản cập nhật bảo mật nginx vì hệ thống gói Debian sẽ không còn làm điều đó cho bạn nữa.


Tôi đã phải điều chỉnh một số lệnh nhưng tổng thể câu trả lời của bạn đã có hiệu quả với tôi. Cảm ơn nhiều!
Robert Reiz

0

Tôi chỉ làm theo hướng dẫn từ Silas S. Brown và tôi đã có thể biên dịch nhị phân Nginx có thể xử lý chuyển tiếp và SSL. Tôi kết hợp mọi thứ lại với nhau thành hình ảnh Docker. Dockerfile và cấu hình có ở đây trên GitHub: https://github.com/reiz/nginx_proxy .

Hình ảnh Nginx Docker trong kho Docker Hub này có thể xử lý kết nối và chuyển tiếp SSL: https://hub.docker.com/r/reiz/nginx_proxy/ .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.