Nginx comme proxy direct pour HTTPS

23

Alors que j'ai réussi à configurer nginx pour proxy le trafic HTTP (à l'aide de ce guide ), toutes les tentatives de proxy HTTPS ont abouti au code 400 ( Bad Request ).

Les journaux de débogage Nginx n'étaient pas du tout utiles:

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"

Quelles sont ces CONNECTdemandes? Est-il même possible de faire proxy_passdes requêtes HTTPS en nginx?

Mise à jour

Besoin d'ajouter qu'un serveur proxy fait partie de mon flux de travail / boîte à outils de développement Web. C'est un excellent moyen de tester / déboguer JavaScript côté client dans un environnement de production (en utilisant des réécritures avant le proxy).

Le langage de configuration de nginx est également sans doute un langage de programmation à part entière. Il a des variables!


la source

Réponses:

17

Il semble que nginx ne prend pas en charge le mode proxy direct avec SSL. Vous devrez utiliser quelque chose comme Squid à la place. Voici un lien avec plus d'explications de l'auteur de nginx: HTTPS et nginx en tant que proxy direct.

Zorayr
la source
1
Merci! Le fil que vous avez lié a 4 ans, mais il me semble aussi que c'est toujours impossible.
Si vous avez besoin d'un proxy pour le débogage, essayez mitmproxy.
Zorayr
7

Juste pour clarifier: comme je l'ai écrit sur le fil de commentaires de mon blog, nginx ne gère pas les appels de méthode CONNECT qui sont utilisés pour établir une connexion TCP brute à un hôte distant via un proxy HTTP - ce qui est logique, étant donné que nginx n'est pas censé fonctionne comme un proxy direct, il se trouve que cela fonctionne assez bien pour le HTTP normal.

Nginx n'a littéralement aucune idée de quoi faire avec ces appels de méthode, c'est pourquoi les messages d'erreur dans les journaux sont plutôt inutiles. Je me suis toujours retrouvé à utiliser privoxy pour HTTPS: http://www.privoxy.org/ - c'est incroyablement facile à configurer aussi. Mais il est toujours impossible de filtrer ou de modifier le contenu des relais HTTPS, car les connexions HTTPS sont gérées avec une connexion brute via la méthode CONNECT et le serveur n'a aucune idée de ce qu'il transmet.

Magnus
la source
2

Si cela ne vous dérange pas de compiler nginx à partir des sources, vous pouvez installer ngx_http_proxy_connect_module . Ce qui suit a fonctionné pour moi dans Debian 9 "Stretch" sur un Raspberry Pi (après avoir ajouté des URL deb-src à /etc/apt/sources.list et fait la mise à jour 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

Ensuite, modifiez-le /usr/local/nginx/conf/nginx.confet faites-le ressembler à ceci (j'ai inclus un exemple de domaines que vous souhaitez bloquer, qui fonctionne avec les procurations SSL et 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;
        }
    }
}

Ensuite, courez /usr/local/nginx/sbin/nginx. Il coexistera très bien avec le nginxpaquet de stock de Debian si vous exécutez également un serveur Web de production sur le port 80 et que vous ne voulez pas risquer de jouer avec cela (mais assurez-vous de démarrer la /usr/localversion séparément au démarrage); Alternativement, avec plus de configuration, vous pouvez exécuter les deux services à partir du nginx que vous avez compilé. Mais si vous configurez votre nginx compilé pour qu'il s'exécute sur un port vers lequel votre pare-feu autorise le trafic, méfiez-vous que vous devrez vérifier manuellement les mises à jour de sécurité de nginx car le système de paquets Debian ne le fera plus pour vous.

Silas S. Brown
la source
J'ai dû modifier certaines commandes, mais dans l'ensemble, votre réponse a fonctionné pour moi. Merci beaucoup!
Robert Reiz
0

Je viens de suivre les instructions de Silas S. Brown et j'ai pu compiler un binaire Nginx qui peut gérer le transfert et SSL. J'ai tout regroupé dans une image Docker. Le Dockerfile et la configuration sont ici sur GitHub: https://github.com/reiz/nginx_proxy .

L'image Nginx Docker dans ce référentiel Docker Hub peut gérer la connexion et le transfert SSL: https://hub.docker.com/r/reiz/nginx_proxy/ .

Robert Reiz
la source