SSL mixto desde la actualización

Tenía (¡tenía!) una instalación de proxy inverso que funcionaba por defecto.
Todo se servía a través de HTTPS según lo diseñado.

He saltado varias versiones y experimentado la actualización de la muerte donde la pantalla permanece en blanco como se informa aquí: Upgrade discourse doesn't work - #6 by Andrew_Bond

He actualizado manualmente mi Discourse con ./launcher rebuild app y estoy en la compilación 2.9.0.beta14 (0da79561c3)

Noté que si un borrador intentaba guardarse, o la mayoría de las otras acciones como publicar, iniciar sesión, recibía un error 403 prohibido (a través del inspector de Chrome).

Mi logo funciona en la esquina superior izquierda del sitio.

Si deshabilito manualmente el elemento de forzar HTTPS a través de la línea de comandos, el logo no se carga ya que estoy en modo mixto donde el elemento http está bloqueado. Todos los demás elementos del sitio continúan funcionando.

No he realizado ningún cambio en el proxy inverso nginx. He intentado reconstruir la aplicación nuevamente sin éxito.

Sugiero que algo cambió en la forma en que Discourse opera en las compilaciones de las que me he actualizado. Este fue el último ID de compilación que pude encontrar que funcionó con la opción de forzar HTTPS funcionando: e9f53dbe0028ca7a5d8926711a1944765d34347

Errores atrapados ahora:

2 Me gusta

Hola Andrew: gracias por el informe. Este problema afecta específicamente a las configuraciones de proxy inverso donde se agregan varios encabezados X-Forwarded-Proto a la solicitud antes de que llegue al contenedor de la aplicación.

Acabo de fusionar una corrección en main; debería aparecer en tests-passed en unos 20 minutos.

Una vez que aparezca en tests-passed, deberás realizar una reconstrucción completa (los cambios en la configuración de nginx no se aplican durante las actualizaciones basadas en la interfaz de usuario).

8 Me gusta

¡Muchas gracias por la pronta respuesta y la rápida solución!

1 me gusta

Entonces, actualización.

He reconstruido la aplicación con ./launcher rebuild app

No hay problemas ahí.

Los errores han desaparecido cuando fuerzo HTTPS, con la excepción de

Ya no tengo 403 denegado, pero, por ejemplo, al intentar iniciar sesión, se me presenta el cuadro de inicio de sesión que parece aceptar los datos y luego se me vuelve a presentar como un usuario no conectado.

El mismo error que el anterior está presente al recargar la página.

He vuelto a deshabilitar forzar HTTPS y el sitio funciona; sin embargo, para que quede claro, los logotipos todavía no se ofrecen.

1 me gusta

Ese error no está relacionado; es causado por Cloudflare inyectando scripts de análisis (y la política de seguridad de contenido predeterminada de Discourse bloqueando la inyección)

¿Puedes compartir más sobre los proxies que tienes entre los usuarios y Discourse? Supongo que Cloudflare es la primera capa. ¿Qué más hay entre Cloudflare y el contenedor de la aplicación Discourse?

3 Me gusta

¡Claro!
Tienes toda la razón. Cloudflare es el primer resultado y luego tenemos el proxy inverso de nginx ofrecido por centminmod sobre docker.

¿Puedes compartir la configuración que tienes para esto? En particular, ¿añade una cabecera X-Forwarded-Proto adicional?

Claro!

# Guía de inicio de Centmin Mod
# debe leer https://centminmod.com/getstarted.html
# Para configuración SSL HTTP/2
# lea https://centminmod.com/nginx_configure_https_ssl_spdy.html

# redirigir de www a no-www SSL forzado
# descomentar, guardar archivo y reiniciar Nginx para habilitar
# si no está seguro, use return 302 antes de usar 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;

  # certificado de extracción de origen autenticado de cloudflare community.centminmod.com/threads/13847/
  #ssl_client_certificate /usr/local/nginx/conf/ssl/cloudflare/exiges.com/origin.crt;
  #ssl_verify_client on;



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

  # antes de habilitar la línea HSTS, lea 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;

  # habilitar 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 y manejador 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;
  # descomentar la inclusión de cloudflare.conf si se usa cloudflare para
  # sitio de servidor y/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;
}

Veo la referencia a la cabecera x-proto…

   proxy_set_header X-Forwarded-Proto $scheme;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
1 me gusta

¿Cómo se está conectando Cloudflare a tu origen? ¿Está utilizando SSL/TLS? Idealmente, deberías estar utilizando “Full” o “Full (Strict)” aquí.

Flexible. He sido perezoso y no he usado certificados de servidor.

Te recomiendo que te configures con una de las opciones SSL seguras de Cloudflare. “Flexible” significa que el tráfico no está cifrado entre Cloudflare y tu servidor.

Echando un vistazo a la configuración de nuevo:

Parece que estás estableciendo la cabecera a https, y luego la estableces de nuevo dos líneas más abajo a $scheme (que será http según tu configuración de Cloudflare). Si eliminas la segunda, se le dirá a Discourse que la conexión es segura (aunque no lo sea).

4 Me gusta

Interesante.

Lo que me parece extraño, sin embargo, es que estuviera funcionando.

Sospecho (pero no lo he confirmado al 100%) que el contenedor NGINX de Discourse estaba mirando previamente la ‘primera’ cabecera X-Forwarded-Proto. Ahora, está mirando la última cabecera X-Forwarded-Proto, lo que es discutiblemente más seguro porque proviene del proxy ‘más reciente’ que tiene la mayor información sobre la solicitud entrante.

Por lo tanto, antes de la actualización, estaba mirando la X-Forwarded-Proto introducida por Cloudflare (https). Ahora, está mirando la cabecera X-Forwarded-Proto introducida por su configuración de proxy inverso ‘centminmod’ (http).

3 Me gusta

He eliminado proxy_set_header X-Forwarded-Proto $scheme; de la configuración con una configuración que ahora funciona.

Para cualquiera que esté leyendo y configurando un centminmod, hay DOS configuraciones para nginx.

Una para http y otra para https.

He eliminado el segundo proxy_set_header X-Forwarded-Proto $scheme; del sitio http, y todo funciona como se esperaba ahora.

Este es mi exiges.com.conf

# Guía de inicio de Centmin Mod
# debe leer https://centminmod.com/getstarted.html

# redirigir de no www a www
# descomentar, guardar archivo y reiniciar Nginx para habilitar
# si no está seguro, use return 302 antes de usar 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 & manejador 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;
  # descomentar la inclusión de cloudflare.conf si se utiliza cloudflare para
  # servidor y/o sitio vhost
  #include /usr/local/nginx/conf/cloudflare.conf;
  include /usr/local/nginx/conf/503include-main.conf;

  # evitar el acceso a directorios y archivos ./
  #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;

# bloquear exploits comunes, inyecciones sql, etc.
#include /usr/local/nginx/conf/block.conf;

  # habilita listados de directorios cuando no se encuentra el archivo index
  #autoindex  on;

  # muestra los tiempos de listado de archivos como hora local
  #autoindex_localtime on;

  # ejemplo de permalinks de 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;
}

Este es mi exiges.com.conf.ssl

# Guía de inicio de Centmin Mod
# debe leer https://centminmod.com/getstarted.html
# Para configuración SSL HTTP/2
# leer https://centminmod.com/nginx_configure_https_ssl_spdy.html

# redirigir de www a no www SSL forzado
# descomentar, guardar archivo y reiniciar Nginx para habilitar
# si no está seguro, use return 302 antes de usar 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 recomendado
  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;

  # antes de habilitar la línea HSTS, lea 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;

  # habilitar 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 & manejador 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;
  # descomentar la inclusión de cloudflare.conf si se utiliza cloudflare para
  # servidor y/o sitio 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, tu tiempo es enormemente apreciado para solucionar este problema.

Por si sirve de algo, ahora estoy completo, no soy flexible con los certificados.

1 me gusta

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