![Nginx als Forwardproxy für HTTPS](https://rvso.com/image/1365821/Nginx%20als%20Forwardproxy%20f%C3%BCr%20HTTPS.png)
Ich konnte nginx zwar erfolgreich so konfigurieren, dass es HTTP-Verkehr weiterleitet (mitdieser Leitfaden), führten alle Versuche, HTTPS-Anfragen per Proxy zu übermitteln, zum Code 400 (Ungültige Anforderung).
Die Nginx-Debugprotokolle waren überhaupt nicht hilfreich:
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"
Was sind das CONNECT
für Anfragen? Ist es überhaupt möglich, proxy_pass
HTTPS-Anfragen in nginx zu stellen?
Aktualisieren
Ich muss hinzufügen, dass ein Proxy-Server Teil meines Webentwicklungs-Workflows/-Toolkits ist. Es ist eine großartige Möglichkeit, clientseitiges JavaScript zu testen/debuggen inProduktionUmgebung (durch Umschreiben vor dem Proxy).
Außerdem ist die Konfigurationssprache von nginx wohl eine eigenständige Programmiersprache. Sie hat Variablen!
Antwort1
Anscheinend unterstützt nginx den Forward-Proxy-Modus mit SSL nicht. Sie müssen etwas wieTintenfischstattdessen. Hier ist ein Link mit weiteren Erklärungen vom Autor von nginx:HTTPS und nginx als Forward-Proxy.
Antwort2
Nur zur Klarstellung: Wie ich im Kommentar-Feed meines Blogs geschrieben habe, verarbeitet nginx keine Aufrufe der CONNECT-Methode, die verwendet werden, um über einen HTTP-Proxy eine reine TCP-Verbindung zu einem Remote-Host herzustellen. Das ist sinnvoll, wenn man bedenkt, dass nginx nicht als Forward-Proxy fungieren soll, aber für normales HTTP trotzdem recht gut funktioniert.
Nginx weiß einfach nicht, was es mit diesen Methodenaufrufen anfangen soll, deshalb sind die Fehlermeldungen in den Protokollen ziemlich nutzlos. Ich habe immer Privoxy für HTTPS verwendet:http://www.privoxy.org/- es ist auch wahnsinnig einfach einzurichten. Aber es ist immer noch unmöglich, den Inhalt von HTTPS-Relays zu filtern oder zu manipulieren, da HTTPS-Verbindungen mit einer Rohverbindung über die CONNECT-Methode gehandhabt werden und der Server keine Ahnung hat, was er weiterleitet.
Antwort3
Wenn es Ihnen nichts ausmacht, nginx aus dem Quellcode zu kompilieren, können Sie Folgendes installieren:ngx_http_proxy_connect_module. Folgendes hat bei mir in Debian 9 „Stretch“ auf einem Raspberry Pi funktioniert (nachdem ich deb-src-URLs zu /etc/apt/sources.list hinzugefügt und apt-get update ausgeführt habe):
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
Bearbeiten Sie es dann /usr/local/nginx/conf/nginx.conf
und sorgen Sie dafür, dass es wie folgt aussieht (ich habe ein Beispiel von Domänen beigefügt, die Sie blockieren möchten und das sowohl mit SSL- als auch mit Nicht-SSL-Proxying funktioniert):
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;
}
}
}
Führen Sie dann aus /usr/local/nginx/sbin/nginx
. Es wird problemlos mit Debians Standardpaket koexistieren, nginx
wenn Sie auch einen Produktionswebserver auf Port 80 betreiben und nicht riskieren möchten, damit herumzuspielen (aber stellen Sie sicher, dass Sie die /usr/local
Version beim Booten separat starten); alternativ können Sie mit mehr Konfiguration beide Dienste von dem von Ihnen kompilierten Nginx aus ausführen. Wenn Sie Ihr kompiliertes Nginx jedoch so einstellen, dass es auf einem Port läuft, zu dem Ihre Firewall Datenverkehr zulässt, müssen Sie manuell nach Sicherheitsupdates für Nginx suchen, da das Debian-Paketsystem dies nicht mehr für Sie übernimmt.
Antwort4
Mein Team brauchte einige Zeit, um herauszufinden, wie das funktioniert. Schließlich haben wir es geschafft, indem wir den folgenden Codeausschnitt in nginx.conf eingebettet haben:
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;
}
}