SSL mixte depuis la mise à niveau

J’avais (j’avais !) une installation de proxy inverse fonctionnelle par défaut.
Tout était servi par HTTPS comme prévu.

J’ai sauté quelques versions et j’ai rencontré la mise à niveau de la mort où l’écran reste vierge, comme signalé ici : Upgrade discourse doesn't work - #6 by Andrew_Bond

J’ai mis à jour manuellement mon discourse avec le ./launcher rebuild app et je suis sur la version 2.9.0.beta14 (0da79561c3)

J’ai noté que si un brouillon tentait d’être enregistré, ou la plupart des autres actions telles que poster, se connecter, j’ai reçu une erreur 403 Forbidden (via l’inspecteur Chrome).

Mon logo fonctionne dans le coin supérieur gauche du site cependant.

Si je désactive manuellement l’élément forcer HTTPS via la ligne de commande, le logo ne se charge pas car je suis en mode mixte où l’élément http est bloqué. Tous les autres éléments du site continuent de fonctionner.

Je n’ai apporté aucune modification au proxy inverse nginx. J’ai essayé de reconstruire l’application à nouveau sans succès.

Je suggère que quelque chose a changé dans la façon dont discourse fonctionne par rapport aux versions à partir desquelles j’ai mis à niveau. C’était le dernier ID de version que j’ai pu trouver qui fonctionnait avec l’option forcer HTTPS activée : e9f53dbe0028ca7a5d8926711a1944765d34347

Erreurs piégées maintenant :

2 « J'aime »

Salut Andrew - merci pour le rapport. Ce problème affecte spécifiquement les configurations de proxy inverse où plusieurs en-têtes X-Forwarded-Proto sont ajoutés à la requête avant qu’elle n’atteigne le conteneur de l’application.

Je viens de fusionner un correctif dans main - il devrait apparaître dans tests-passed dans environ 20 minutes

Une fois qu’il apparaîtra dans tests-passed, vous devrez effectuer une reconstruction complète (les modifications de configuration nginx ne sont pas appliquées lors des mises à niveau basées sur l’interface utilisateur).

8 « J'aime »

Merci beaucoup pour votre réponse rapide et pour la correction rapide !

1 « J'aime »

Alors, mise à jour.

J’ai reconstruit l’application avec ./launcher rebuild app

Aucun problème de ce côté-là.

Les erreurs ont disparu lorsque j’ai forcé HTTPS, à l’exception de

Je n’ai plus de 403 refusé, mais par exemple, lorsque j’essaie de me connecter, la boîte de connexion apparaît, semble accepter les données, puis je suis de nouveau présenté avec un utilisateur non connecté.

La même erreur que ci-dessus est présente lors du rechargement de la page.

J’ai de nouveau désactivé le forçage HTTPS et le site fonctionne - pour être clair, les logos ne sont toujours pas proposés.

1 « J'aime »

Cette erreur n’est pas liée - elle est causée par Cloudflare qui injecte des scripts d’analyse (et la politique de sécurité du contenu par défaut de Discourse qui bloque l’injection)

Pouvez-vous nous en dire plus sur les proxys que vous avez entre les utilisateurs et Discourse ? Je suppose que Cloudflare est la première couche ? Qu’y a-t-il d’autre entre Cloudflare et le conteneur de l’application Discourse ?

3 « J'aime »

Absolument !
Vous avez tout à fait raison. Cloudflare est le premier résultat, puis nous avons le proxy inverse nginx proposé par centminmod sur le docker.

Pouvez-vous partager la configuration que vous avez pour cela ? En particulier, ajoute-t-il un en-tête X-Forwarded-Proto supplémentaire ?

Bien sûr !

# Guide de démarrage de Centmin Mod
# à lire impérativement sur https://centminmod.com/getstarted.html
# pour la configuration SSL HTTP/2
# lire sur https://centminmod.com/nginx_configure_https_ssl_spdy.html

# redirection de www vers non-www avec SSL forcé
# décommentez, enregistrez le fichier et redémarrez Nginx pour activer
# en cas de doute, utilisez return 302 avant d'utiliser return 301
 server {
       listen   80;
       server_name exiges.com www.exiges.com;
       return 302 https://$server_name$request_uri;
 }

server {
  listen 443 ssl http2;
  server_name exiges.com www.exiges.com;

  ssl_dhparam /usr/local/nginx/conf/ssl/exiges.com/dhparam.pem;
  ssl_certificate      /usr/local/nginx/conf/ssl/exiges.com/exiges.com.crt;
  ssl_certificate_key  /usr/local/nginx/conf/ssl/exiges.com/exiges.com.key;
  include /usr/local/nginx/conf/ssl_include.conf;

  # certificat de rappel d'origine authentifié par cloudflare community.centminmod.com/threads/13847/
  #ssl_client_certificate /usr/local/nginx/conf/ssl/cloudflare/exiges.com/origin.crt;
  #ssl_verify_client on;



  # recommandé par Mozilla
  ssl_ciphers TLS13-AES-128-GCM-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS;
  ssl_prefer_server_ciphers   on;
  #add_header Alternate-Protocol  443:npn-spdy/3;

  # avant d'activer la ligne HSTS, lisez centminmod.com/nginx_domain_dns_setup.html#hsts
  #add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";
  #add_header X-Frame-Options SAMEORIGIN;
  add_header X-Xss-Protection "1; mode=block" always;
  add_header X-Content-Type-Options "nosniff" always;
  #add_header Referrer-Policy "strict-origin-when-cross-origin";
  #add_header Permissions-Policy "accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()";
  #spdy_headers_comp 5;
  ssl_buffer_size 1369;
  ssl_session_tickets on;

  # activer le stapling OCSP
  #resolver 8.8.8.8 8.8.4.4 1.1.1.1 1.0.0.1 valid=10m;
  #resolver_timeout 10s;
  #ssl_stapling on;
  #ssl_stapling_verify on;
  #ssl_trusted_certificate /usr/local/nginx/conf/ssl/exiges.com/exiges.com-trusted.crt;

# ngx_pagespeed et gestionnaire ngx_pagespeed
#include /usr/local/nginx/conf/pagespeed.conf;
#include /usr/local/nginx/conf/pagespeedhandler.conf;
#include /usr/local/nginx/conf/pagespeedstatslog.conf;

  # limit_conn limit_per_ip 16;
  # ssi  on;

  access_log /home/nginx/domains/exiges.com/log/access.log combined buffer=256k flush=5m;
  error_log /home/nginx/domains/exiges.com/log/error.log;

  include /usr/local/nginx/conf/autoprotect/exiges.com/autoprotect-exiges.com.conf;
  root /home/nginx/domains/exiges.com/public;
  # décommentez l'inclusion de cloudflare.conf si vous utilisez cloudflare pour
  # le site du serveur et/ou du vhost
  #include /usr/local/nginx/conf/cloudflare.conf;
  include /usr/local/nginx/conf/503include-main.conf;


location / {
       proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
       proxy_set_header        X-Forwarded-Proto https;
       proxy_http_version 1.1;
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Real-IP $remote_addr;
   }

  include /usr/local/nginx/conf/php.conf;

  #include /usr/local/nginx/conf/pre-staticfiles-local-exiges.com.conf;
  #include /usr/local/nginx/conf/pre-staticfiles-global.conf;
  #include /usr/local/nginx/conf/staticfiles.conf;
  #include /usr/local/nginx/conf/drop.conf;
  #include /usr/local/nginx/conf/errorpage.conf;
  #include /usr/local/nginx/conf/vts_server.conf;
}

Je vois la référence à l’en-tête x-proto…

   proxy_set_header X-Forwarded-Proto $scheme;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
1 « J'aime »

Comment Cloudflare se connecte-t-il à votre origine ? Utilise-t-il SSL/TLS ? Idéalement, vous devriez utiliser « Full » ou « Full (Strict) » ici.

Flexible. J’ai été paresseux et je n’ai pas utilisé de certificats serveur.

Je vous recommande de vous équiper de l’une des options SSL sécurisées de Cloudflare. « Flexible » signifie que le trafic n’est pas chiffré entre Cloudflare et votre serveur.

En examinant à nouveau la configuration :

Il semble que vous définissiez l’en-tête sur https, puis que vous le définissiez à nouveau deux lignes plus bas sur $scheme (qui sera http en fonction de votre configuration Cloudflare). Si vous supprimez le second, Discourse sera informé que la connexion est sécurisée (même si elle ne l’est pas).

4 « J'aime »

Intéressant.

Ce que je trouve étrange cependant, c’est que cela fonctionnait.

Je soupçonne (mais je n’ai pas 100% confirmé) que le conteneur NGINX de Discourse regardait précédemment le ‘premier’ en-tête X-Forwarded-Proto. Maintenant, il regarde le ‘dernier’ en-tête X-Forwarded-Proto, ce qui est sans doute plus sûr car il provient du proxy ‘le plus récent’ qui a le plus d’informations sur la requête entrante.

Ainsi, avant la mise à jour, il regardait le X-Forwarded-Proto introduit par Cloudflare (https). Maintenant, il regarde l’en-tête X-Forwarded-Proto introduit par votre configuration de proxy inverse ‘centminmod’ (http).

3 « J'aime »

J’ai supprimé proxy_set_header X-Forwarded-Proto $scheme; de la configuration avec une configuration maintenant fonctionnelle.

Pour ceux qui lisent et configurent un centminmod, il existe DEUX configurations pour nginx.

Une pour le http et une pour le https.

J’ai supprimé le second proxy_set_header X-Forwarded-Proto $scheme; du site http, et tout fonctionne comme prévu maintenant.

Voici mon exiges.com.conf

# Guide de démarrage Centmin Mod
# à lire absolument https://centminmod.com/getstarted.html

# redirection du non-www vers www
# décommentez, enregistrez le fichier et redémarrez Nginx pour activer
# en cas de doute, utilisez return 302 avant d'utiliser return 301
#server {
#            listen   80;
#            server_name exiges.com;
#            return 301 $scheme://www.exiges.com$request_uri;
#       }

server {
  server_name exiges.com www.exiges.com;
#return 301 https://exiges.com.com$request_uri;
#return 301 $scheme://www.exiges.com$request_uri;

# ngx_pagespeed & gestionnaire ngx_pagespeed
#include /usr/local/nginx/conf/pagespeed.conf;
#include /usr/local/nginx/conf/pagespeedhandler.conf;
#include /usr/local/nginx/conf/pagespeedstatslog.conf;

  #add_header X-Frame-Options SAMEORIGIN;
  add_header X-Xss-Protection "1; mode=block" always;
  add_header X-Content-Type-Options "nosniff" always;
  #add_header Referrer-Policy "strict-origin-when-cross-origin";
  #add_header Permissions-Policy "accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()";

  # limit_conn limit_per_ip 16;
  # ssi  on;

  access_log /home/nginx/domains/exiges.com/log/access.log combined buffer=256k flush=5m;
  error_log /home/nginx/domains/exiges.com/log/error.log;

  include /usr/local/nginx/conf/autoprotect/exiges.com/autoprotect-exiges.com.conf;
  root /home/nginx/domains/exiges.com/public;
  # décommentez l'inclusion de cloudflare.conf si vous utilisez cloudflare pour
  # le serveur et/ou le site vhost
  #include /usr/local/nginx/conf/cloudflare.conf;
  include /usr/local/nginx/conf/503include-main.conf;

  # empêcher l'accès aux répertoires et fichiers ./
  #location ~ (?:^|/)\\. {
  # deny all;
  # }

  location / {
 proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
		    proxy_set_header        X-Forwarded-Proto https;
                #proxy_set_header Host $http_host;
                proxy_http_version 1.1;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                #proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Real-IP $remote_addr;
  #include /usr/local/nginx/conf/503include-only.conf;

# bloquer les exploits courants, les injections sql etc.
#include /usr/local/nginx/conf/block.conf;

  # active les listages de répertoires lorsque le fichier index n'est pas trouvé
  #autoindex  on;

  # affiche les heures de liste des fichiers en heure locale
  #autoindex_localtime on;

  # exemple de permaliens Wordpress
  #try_files $uri $uri/ /index.php?q=$uri&$args;

  }

  include /usr/local/nginx/conf/php.conf;

  #include /usr/local/nginx/conf/pre-staticfiles-local-exiges.com.conf;
  #include /usr/local/nginx/conf/pre-staticfiles-global.conf;
  #include /usr/local/nginx/conf/staticfiles.conf;
  #include /usr/local/nginx/conf/drop.conf;
  #include /usr/local/nginx/conf/errorpage.conf;
  #include /usr/local/nginx/conf/vts_server.conf;
}

Voici mon exiges.com.conf.ssl

# Guide de démarrage Centmin Mod
# à lire absolument https://centminmod.com/getstarted.html
# Pour la configuration HTTP/2 SSL
# lire https://centminmod.com/nginx_configure_https_ssl_spdy.html

# redirection du www vers non-www SSL forcé
# décommentez, enregistrez le fichier et redémarrez Nginx pour activer
# en cas de doute, utilisez return 302 avant d'utiliser return 301
 server {
       listen   80;
       server_name exiges.com www.exiges.com;
       return 302 https://$server_name$request_uri;
 }

server {
  listen 443 ssl http2;
  server_name exiges.com www.exiges.com;

  ssl_dhparam /usr/local/nginx/conf/ssl/exiges.com/dhparam.pem;
  ssl_certificate      /usr/local/nginx/conf/ssl/exiges.com/exiges.com.crt;
  ssl_certificate_key  /usr/local/nginx/conf/ssl/exiges.com/exiges.com.key;
  include /usr/local/nginx/conf/ssl_include.conf;

  # certificat de rappel d'origine authentifié par cloudflare community.centminmod.com/threads/13847/
  #ssl_client_certificate /usr/local/nginx/conf/ssl/cloudflare/exiges.com/origin.crt;
  #ssl_verify_client on;



  # recommandé par Mozilla
  ssl_ciphers TLS13-AES-128-GCM-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS;
  ssl_prefer_server_ciphers   on;
  #add_header Alternate-Protocol  443:npn-spdy/3;

  # avant d'activer la ligne HSTS, lisez centminmod.com/nginx_domain_dns_setup.html#hsts
  #add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";
  #add_header X-Frame-Options SAMEORIGIN;
  add_header X-Xss-Protection "1; mode=block" always;
  add_header X-Content-Type-Options "nosniff" always;
  #add_header Referrer-Policy "strict-origin-when-cross-origin";
  #add_header Permissions-Policy "accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()";
  #spdy_headers_comp 5;
  ssl_buffer_size 1369;
  ssl_session_tickets on;

  # activer l'agrafage OCSP
  #resolver 8.8.8.8 8.8.4.4 1.1.1.1 1.0.0.1 valid=10m;
  #resolver_timeout 10s;
  #ssl_stapling on;
  #ssl_stapling_verify on;
  #ssl_trusted_certificate /usr/local/nginx/conf/ssl/exiges.com/exiges.com-trusted.crt;

# ngx_pagespeed & gestionnaire ngx_pagespeed
#include /usr/local/nginx/conf/pagespeed.conf;
#include /usr/local/nginx/conf/pagespeedhandler.conf;
#include /usr/local/nginx/conf/pagespeedstatslog.conf;

  # limit_conn limit_per_ip 16;
  # ssi  on;

  access_log /home/nginx/domains/exiges.com/log/access.log combined buffer=256k flush=5m;
  error_log /home/nginx/domains/exiges.com/log/error.log;

  include /usr/local/nginx/conf/autoprotect/exiges.com/autoprotect-exiges.com.conf;
  root /home/nginx/domains/exiges.com/public;
  # décommentez l'inclusion de cloudflare.conf si vous utilisez cloudflare pour
  # le serveur et/ou le site vhost
  include /usr/local/nginx/conf/cloudflare.conf;
  include /usr/local/nginx/conf/503include-main.conf;


location / {
       proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
       proxy_set_header        X-Forwarded-Proto https;
       proxy_http_version 1.1;
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Real-IP $remote_addr;
   }

  include /usr/local/nginx/conf/php.conf;

  #include /usr/local/nginx/conf/pre-staticfiles-local-exiges.com.conf;
  #include /usr/local/nginx/conf/pre-staticfiles-global.conf;
  #include /usr/local/nginx/conf/staticfiles.conf;
  #include /usr/local/nginx/conf/drop.conf;
  #include /usr/local/nginx/conf/errorpage.conf;
  #include /usr/local/nginx/conf/vts_server.conf;
}

@david votre temps est énormément apprécié pour résoudre ce problème.

Pour information, je suis maintenant complet, pas flexible avec les certificats.

1 « J'aime »

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.