Projet

Général

Profil

Development #16863

poser SECURE_PROXY_SSL_HEADER

Ajouté par Frédéric Péters il y a presque 7 ans. Mis à jour il y a plus de 5 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
-
Catégorie:
-
Version cible:
-
Début:
13 juin 2017
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

Je rate sans doute un truc, dans nos exemples de configuration nginx, et dans nos configurations en vrai, on fait :

            proxy_set_header   X-Forwarded-SSL on;
            proxy_set_header   X-Forwarded-Protocol ssl;
            proxy_set_header   X-Forwarded-Proto https;

Festival de la redondance, mais en l'absence de settings.SECURE_PROXY_SSL_HEADER, qui est vide par défaut, ça tombe sur :

    def _get_scheme(self):
        return 'https' if os.environ.get("HTTPS") == "on" else 'http'

Et le HTTPS dans l'environnement, j'imagine que c'est nginx qui le pose (j'ai regardé les sources sans identifier vraiment, mais je n'ai pas trouvé de mention d'HTTPS dans gunicorn).

Anyway, pour faciliter l'offloading HTTPS, hobo ne pourrait pas taper SECURE_PROXY_SSL_HEADER = ('X-Forwarded-Proto', 'https') dans debian_config_common.py ? (ou une des autres valeurs qu'on pose)


Fichiers

Révisions associées

Révision 62e597e1 (diff)
Ajouté par Frédéric Péters il y a plus de 6 ans

debian: set SECURE_PROXY_SSL_HEADER for nginx/runserver integration (#16863)

Historique

#1

Mis à jour par Benjamin Dauvergne il y a presque 7 ans

Il me semble que c'est gunicorn qui le gère à la place de Django et met le os.environ['HTTPS'] = 'on'.

#2

Mis à jour par Frédéric Péters il y a presque 7 ans

ok, creusé davantage, gunicorn définit :

class SecureSchemeHeader(Setting):
    name = "secure_scheme_headers" 
    section = "Server Mechanics" 
    validator = validate_dict
    default = {
        "X-FORWARDED-PROTOCOL": "ssl",
        "X-FORWARDED-PROTO": "https",
        "X-FORWARDED-SSL": "on" 
    }

et face à l'entête, termine en mettant :

    environ['wsgi.url_scheme'] = url_scheme

et dans django c'est WSGIRequest qui définit :

    def _get_scheme(self):
        return self.environ.get('wsgi.url_scheme')

(plus tard je regarderai ce que fait uwsgi).

#3

Mis à jour par Frédéric Péters il y a presque 7 ans

uwsgi regarde HTTP_X_FORWARDED_SSL et s'il y a "on" dedans il passe l'info à wsgi dans wsgi.url_scheme.

#4

Mis à jour par Frédéric Péters il y a plus de 6 ans

À l'occasion de la préparation d'une image de développement pour la formation à Strasbourg, je retombe ici; dans une configuration qui a nginx qui fait reverse proxy http vers un service lancé en runserver local, il n'y a rien pour indiquer l'https.

Avec django 1.8 il y a encore moyen d'arranger les choses en posant HTTPS=on dans l'environnement du runserver (comme noté dans la description), mais dans django master, le _get_scheme est passé de return 'https' if os.environ.get("HTTPS") == "on" else 'http' à return 'http'. (ccff08c1, Fixed #24463 -- Removed mod_python functionality from HttpRequest._get_scheme()).

#5

Mis à jour par Benjamin Dauvergne il y a plus de 6 ans

Ack.

#6

Mis à jour par Frédéric Péters il y a plus de 6 ans

  • Statut changé de En cours à Résolu (à déployer)
commit 62e597e15761553841b34b604410764201dc6a96
Author: Frédéric Péters <fpeters@entrouvert.com>
Date:   Sun Dec 3 13:11:30 2017 +0100

    debian: set SECURE_PROXY_SSL_HEADER for nginx/runserver integration (#16863)
#7

Mis à jour par Frédéric Péters il y a plus de 5 ans

  • Statut changé de Résolu (à déployer) à Solution déployée

Formats disponibles : Atom PDF