Nginx sebagai proxy penerusan untuk HTTPS

23

Sementara saya berhasil mengkonfigurasi nginx ke proxy HTTP traffic (menggunakan panduan ini ), semua upaya untuk mem-proxy permintaan HTTPS menghasilkan kode 400 ( Bad Request ).

Log debug nginx sama sekali tidak membantu:

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"

Apa CONNECTpermintaan ini ? Apakah mungkin untuk proxy_passpermintaan HTTPS di nginx?

Memperbarui

Perlu menambahkan bahwa server proxy adalah bagian dari alur kerja / toolkit pengembangan web saya. Ini cara yang bagus untuk menguji / men-debug JavaScript sisi klien di lingkungan produksi (menggunakan penulisan ulang sebelum proxy).

Juga bahasa konfigurasi nginx bisa dibilang adalah bahasa pemrograman dengan haknya sendiri. Ini memiliki variabel!


sumber

Jawaban:

17

Sepertinya nginx tidak mendukung mode proxy yang maju dengan SSL. Anda harus menggunakan sesuatu seperti Squid sebagai gantinya. Berikut ini tautan dengan penjelasan lebih lanjut dari penulis nginx: HTTPS dan nginx sebagai Forward Proxy.

Zorayr
sumber
1
Terima kasih! Utas yang Anda tautkan berusia 4 tahun, tetapi menurut saya itu masih mustahil.
Jika Anda memerlukan proxy untuk debugging, coba mitmproxy.
Zorayr
7

Hanya untuk memperjelas: ketika saya menulis di feed komentar blog saya, nginx tidak menangani panggilan metode CONNECT yang digunakan untuk membuat koneksi TCP mentah ke host jarak jauh melalui proxy HTTP - yang masuk akal, mengingat bahwa nginx tidak seharusnya bekerja sebagai proxy yang maju, itu hanya bekerja dengan baik untuk HTTP reguler.

Nginx benar-benar tidak tahu apa yang harus dilakukan dengan pemanggilan metode itu, itu sebabnya pesan kesalahan dalam log agak tidak berguna. Saya selalu menemukan diri saya menggunakan privoxy untuk HTTPS: http://www.privoxy.org/ - sangat mudah untuk diatur juga. Tetapi masih tidak mungkin untuk memfilter atau memotong-motong konten relay HTTPS, karena koneksi HTTPS ditangani dengan koneksi mentah melalui metode CONNECT dan server tidak tahu apa itu relay.

Magnus
sumber
2

Jika Anda tidak keberatan mengkompilasi nginx dari sumber, Anda dapat menginstal ngx_http_proxy_connect_module . Berikut ini bekerja untuk saya di Debian 9 "Peregangan" pada Raspberry Pi (setelah saya menambahkan URL deb-src ke /etc/apt/sources.list dan lakukan pembaruan 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

Kemudian edit /usr/local/nginx/conf/nginx.confdan buat tampilannya seperti ini (saya telah menyertakan contoh domain yang ingin Anda blokir, yang berfungsi baik dengan proxy SSL dan non-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;
        }
    }
}

Kemudian jalankan /usr/local/nginx/sbin/nginx. Ini akan dengan senang hati hidup berdampingan dengan nginxpaket stok Debian jika Anda juga menjalankan server web produksi pada port 80 dan tidak ingin mengambil risiko mengacaukannya (tapi pastikan untuk memulai /usr/localversi secara terpisah saat boot); sebagai alternatif, dengan lebih banyak konfigurasi, Anda dapat menjalankan kedua layanan dari nginx yang telah Anda kompilasi. Tetapi jika Anda mengatur nginx yang dikompilasi untuk dijalankan pada port yang memungkinkan firewall Anda untuk lalu lintas, berhati-hatilah Anda harus memeriksa secara manual untuk pembaruan keamanan nginx karena sistem paket Debian tidak lagi akan melakukannya untuk Anda.

Silas S. Brown
sumber
Saya harus mengubah beberapa perintah tetapi secara keseluruhan jawaban Anda bekerja untuk saya. Terimakasih banyak!
Robert Reiz
0

Saya hanya mengikuti instruksi dari Silas S. Brown dan saya dapat mengkompilasi biner Nginx yang dapat menangani penerusan dan SSL. Saya menggabungkan semuanya menjadi gambar Docker. Dockerfile dan konfigurasinya ada di GitHub: https://github.com/reiz/nginx_proxy .

Gambar Nginx Docker dalam repositori Docker Hub ini dapat menangani koneksi dan penerusan SSL: https://hub.docker.com/r/reiz/nginx_proxy/ .

Robert Reiz
sumber