Nginx 作為 HTTPS 的轉送代理

Nginx 作為 HTTPS 的轉送代理

雖然我能夠成功設定 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"

這些要求是什麼CONNECTproxy_passnginx 中是否可以進行HTTPS 請求?

更新

需要補充的是,代理伺服器是我的 Web 開發工作流程/工具包的一部分。這是測試/調試客戶端 JavaScript 的好方法生產環境(在代理之前使用重寫)。

另外,nginx 的設定語言本身就可以說是一種程式語言。是有變數的!

答案1

nginx 似乎不支援 SSL 轉送代理模式。你需要使用類似的東西烏賊反而。這是 nginx 作者的更多解釋的連結:HTTPS 和 nginx 作為轉送代理。

答案2

只是為了澄清:正如我在博客的評論提要中所寫的那樣,nginx 不處理CONNECT 方法調用,該方法調用用於通過HTTP 代理建立到遠程主機的原始TCP 連接- 這是有道理的,考慮到nginx不應該作為轉送代理,它恰好適用於常規 HTTP。

Nginx 實際上不知道如何處理這些方法調用,這就是為什麼日誌中的錯誤訊息毫無用處的原因。我總是發現自己使用 privoxy 作為 HTTPS:http://www.privoxy.org/- 設定起來也非常簡單。但仍然不可能過濾或破壞 HTTPS 中繼的內容,因為 HTTPS 連接是透過 CONNECT 方法使用原始連接進行處理的,伺服器不知道它正在中繼什麼。

答案3

如果你不介意從原始碼編譯 nginx,你可以安裝ngx_http_proxy_connect_module。以下內容在 Raspberry Pi 上的 Debian 9“Stretch”中為我工作(在我將 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/nginxnginx如果您還在連接埠 80 上運行生產網頁伺服器並且不想冒險搞亂它,那麼它會很高興與 Debian 的庫存包共存(但請確保/usr/local在啟動時單獨啟動該版本);或者,透過更多配置,您可以從您編譯的 nginx 執行這兩個服務。但是,如果您確實將編譯後的 nginx 設定為在防火牆允許流量存取的連接埠上執行,請注意,您必須手動檢查 nginx 安全性更新,因為 Debian 軟體包系統將不再為您執行此操作。

答案4

我的團隊花了一些時間才弄清楚如何完成這項工作。最後,我們透過將下面的程式碼片段嵌入到 nginx.conf 中來實現:

stream {
  map_hash_bucket_size 128;
  map $ssl_preread_server_name $sphere {
    site-01.example.com site-01;
    site-02.example.com site-02;
  }

  upstream site-01 {
    server 192.168.0.1:443;
  }

  upstream site-02 {
    server 192.168.0.2:443;
  }

  server {
    listen 443;
    proxy_pass $sphere;
    ssl_preread on;
  }
}

相關內容