SSL misto dopo l'aggiornamento

Ho (avevo!) un’installazione di reverse proxy funzionante di default.
Tutto veniva servito da HTTPS come previsto.

Sono saltato di qualche versione e ho riscontrato l’aggiornamento della morte in cui lo schermo rimane vuoto come riportato qui: Upgrade discourse doesn't work - #6 by Andrew_Bond

Ho aggiornato manualmente il mio discourse con ./launcher rebuild app e sono sulla build 2.9.0.beta14 (0da79561c3)

Ho notato che se una bozza tentava di salvare, o la maggior parte delle altre azioni come postare, accedere, ricevevo un errore 403 forbidden (tramite l’inspector di Chrome).

Il mio logo funziona nell’angolo in alto a sinistra del sito.

Se disabilito manualmente l’elemento force https tramite riga di comando, il logo non viene caricato poiché mi trovo in modalità mista dove l’elemento http viene bloccato. Tutti gli altri elementi del sito continuano a funzionare.

Non ho apportato alcuna modifica al reverse nginx. Ho provato a ricostruire nuovamente l’app senza successo.

Sto suggerendo che qualcosa è cambiato nel modo in cui discourse opera dalle build da cui ho aggiornato. Questo è l’ultimo ID di build che riesco a trovare che funzionava con l’opzione force https attiva: e9f53dbe0028ca7a5d8926711a1944765d34347

Errori ora intrappolati:

2 Mi Piace

Ciao Andrew, grazie per il report. Questo problema riguarda specificamente le configurazioni di reverse-proxy in cui vengono aggiunti più header X-Forwarded-Proto alla richiesta prima che raggiunga il container dell’applicazione.

Ho appena unito una correzione in main, dovrebbe apparire in tests-passed tra circa 20 minuti.

Una volta che apparirà in tests-passed, dovrai eseguire una rebuild completa (le modifiche alla configurazione di nginx non vengono applicate durante gli aggiornamenti basati sull’interfaccia utente).

8 Mi Piace

Molte grazie per la rapida risposta e la veloce correzione!

1 Mi Piace

Quindi, aggiornamento.

Ho ricostruito l’app con ./launcher rebuild app

Nessun problema lì.

Gli errori sono scomparsi quando ho forzato HTTPS, ad eccezione di

Non ho più il 403 negato, ma ad esempio quando provo ad accedere mi viene presentata la finestra di accesso che sembra accettare i dati, quindi mi viene ripresentato un utente non autenticato

Lo stesso errore di cui sopra è presente quando si ricarica la pagina.

Ho nuovamente disabilitato la forzatura di HTTPS e il sito funziona - per chiarezza, tuttavia, i loghi non vengono ancora offerti.

1 Mi Piace

Quell’errore non è correlato: è causato da Cloudflare che inietta script di analisi (e la policy di sicurezza dei contenuti predefinita di Discourse che blocca l’iniezione)

Puoi condividere di più sui proxy che hai tra gli utenti e Discourse? Suppongo che Cloudflare sia il primo livello? Cos’altro c’è tra Cloudflare e il container dell’app Discourse?

3 Mi Piace

Certamente!
Hai perfettamente ragione. Cloudflare è il primo risultato, poi abbiamo il proxy inverso nginx offerto da centminmod su docker.

Puoi condividere la configurazione che hai per questo? In particolare, aggiunge un’ulteriore intestazione X-Forwarded-Proto?

Certo!

# Guida introduttiva a Centmin Mod
# da leggere https://centminmod.com/getstarted.html
# per la configurazione SSL HTTP/2
# leggere https://centminmod.com/nginx_configure_https_ssl_spdy.html

# reindirizza da www a non-www SSL forzato
# decommentare, salvare il file e riavviare Nginx per abilitare
# in caso di dubbi usare return 302 prima di usare 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;

  # certificato di autenticazione per l'origine di cloudflare community.centminmod.com/threads/13847/
  #ssl_client_certificate /usr/local/nginx/conf/ssl/cloudflare/exiges.com/origin.crt;
  #ssl_verify_client on;



  # raccomandato da 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;

  # prima di abilitare HSTS leggere 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;

  # abilita ocsp stapling
  #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 e gestore 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;
  # decommentare l'inclusione di cloudflare.conf se si utilizza cloudflare per
  # il sito del server e/o 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;
}

Vedo il riferimento all’header x-proto…

   proxy_set_header X-Forwarded-Proto $scheme;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
1 Mi Piace

In che modo Cloudflare si connette alla tua origine? Utilizza SSL/TLS? Idealmente dovresti usare “Full” o “Full (Strict)” qui.

Flessibile. Sono stato pigro e non ho usato certificati server

Ti consiglierei di configurare una delle opzioni SSL sicure di Cloudflare. “Flessibile” significa che il traffico non è crittografato tra Cloudflare e il tuo server.

Dando un’altra occhiata alla configurazione:

Sembra che tu stia impostando l’header su https e poi lo stai impostando di nuovo due righe sotto su $scheme (che sarà http in base alla tua configurazione Cloudflare). Se rimuovi il secondo, a Discourse verrà detto che la connessione è sicura (anche se non lo è).

4 Mi Piace

Interessante.

Quello che trovo strano, però, è che funzionava.

Sospetto (ma non l’ho confermato al 100%) che il container NGINX di Discourse stesse precedentemente guardando la ‘prima’ intestazione X-Forwarded-Proto. Ora, sta guardando l’ultima intestazione X-Forwarded-Proto, che è discutibilmente più sicura perché proviene dal proxy ‘più recente’ che ha più informazioni sulla richiesta in arrivo.

Quindi, prima dell’aggiornamento, stava guardando la X-Forwarded-Proto introdotta da Cloudflare (https). Ora, sta guardando l’intestazione X-Forwarded-Proto introdotta dalla tua configurazione del proxy inverso ‘centminmod’ (http).

3 Mi Piace

Ho rimosso proxy_set_header X-Forwarded-Proto $scheme; dalla configurazione con una configurazione ora funzionante.

Per chiunque stia leggendo e configurando un centminmod, ci sono DUE configurazioni per nginx.

Una per l’http e una per l’https

Ho rimosso il secondo proxy_set_header X-Forwarded-Proto $scheme; dal sito http, e ora tutto funziona come previsto.

Questo è il mio exiges.com.conf

# Centmin Mod Getting Started Guide
# must read https://centminmod.com/getstarted.html

# redirect from non-www to www
# uncomment, save file and restart Nginx to enable
# if unsure use return 302 before using 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 & ngx_pagespeed handler
#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;
  # uncomment cloudflare.conf include if using cloudflare for
  # server and/or vhost site
  #include /usr/local/nginx/conf/cloudflare.conf;
  include /usr/local/nginx/conf/503include-main.conf;

  # prevent access to ./directories and files
  #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;

# block common exploits, sql injections etc
#include /usr/local/nginx/conf/block.conf;

  # Enables directory listings when index file not found
  #autoindex  on;

  # Shows file listing times as local time
  #autoindex_localtime on;

  # Wordpress Permalinks example
  #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;
}

Questo è il mio exiges.com.conf.ssl

# Centmin Mod Getting Started Guide
# must read https://centminmod.com/getstarted.html
# For HTTP/2 SSL Setup
# read https://centminmod.com/nginx_configure_https_ssl_spdy.html

# redirect from www to non-www  forced SSL
# uncomment, save file and restart Nginx to enable
# if unsure use return 302 before using 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;

  # cloudflare authenticated origin pull cert community.centminmod.com/threads/13847/
  #ssl_client_certificate /usr/local/nginx/conf/ssl/cloudflare/exiges.com/origin.crt;
  #ssl_verify_client on;



  # mozilla recommended
  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;

  # before enabling HSTS line below read 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;

  # enable ocsp stapling
  #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 & ngx_pagespeed handler
#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;
  # uncomment cloudflare.conf include if using cloudflare for
  # server and/or vhost site
  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 il tuo tempo è enormemente apprezzato nel risolvere questo problema.

Per quello che vale, ora sono pieno, non flessibile con i certificati.

1 Mi Piace

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