web-dev-qa-db-fra.com

Nginx en tant que proxy direct pour HTTPS

Bien que j’ai pu configurer avec succès nginx sur le trafic HTTP proxy (en utilisant ce guide ), toutes les tentatives de proxy des demandes HTTPS ont abouti au code 400 ( Requête incorrecte ).

Les journaux de débogage de Nginx n’ont pas du tout été 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 demandes CONNECT? Est-il même possible de proxy_pass demandes HTTPS dans nginx?

Mettre à 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 le code 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 un langage de programmation à part entière. Il a des variables!

23
katspaugh

On dirait 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

16
Zorayr

Juste pour clarifier les choses: comme je l’ai écrit dans le fil de commentaires de mon blog, nginx ne gère pas les appels à la méthode CONNECT qui sont utilisés pour établir une connexion brute TCP à un hôte distant via un proxy HTTP - ce qui est logique, en considérant que nginx n’est pas supposé fonctionner en tant que proxy direct, il se trouve qu’il fonctionne assez bien pour le HTTP normal, peu importe.

Nginx n'a littéralement aucune idée de ce qu'il faut 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 trouvé à utiliser privoxy pour HTTPS: http://www.privoxy.org/ - sa configuration est incroyablement facile. 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 retransmet.

7
Magnus

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 "Étirer" sur un Raspberry Pi (après avoir ajouté les URL deb-src à /etc/apt/sources.list et effectué 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

Editez ensuite /usr/local/nginx/conf/nginx.conf et donnez-lui l’apparence suivante (j’ai inclus un exemple de domaine que vous souhaitez bloquer, qui fonctionne à la fois avec les serveurs proxy 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, lancez /usr/local/nginx/sbin/nginx. Il cohabitera volontiers avec le paquet stock nginx de Debian si vous exécutez également un serveur Web de production sur le port 80 et ne voulez pas risquer de vous déranger (mais assurez-vous de démarrer la version /usr/local séparément au démarrage); sinon, 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 s'exécuter sur un port sur lequel votre pare-feu autorise le trafic, vous devez donc vérifier manuellement les mises à jour de sécurité nginx, car le système de paquets Debian ne le fera plus pour vous.

2
Silas S. Brown

Je viens de suivre les instructions de Silas S. Brown et j’ai pu compiler un fichier binaire Nginx capable de gérer la transmission et le protocole SSL. J'ai tout réuni dans une image Docker. Le fichier Docker 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/ .

0
Robert Reiz