SSL misto desde a atualização

Eu tinha (tinha!) uma instalação de proxy reverso funcional padrão.
Tudo estava sendo servido por HTTPS como projetado.

Eu pulei algumas versões e experimentei a atualização da morte onde a tela permanece em branco, conforme relatado aqui: Upgrade discourse doesn't work - #6 by Andrew_Bond

Eu atualizei manualmente meu discourse com o ./launcher rebuild app e estou na build 2.9.0.beta14 (0da79561c3)

Notei que se um rascunho tentasse salvar, ou a maioria das outras ações como postar, fazer login, eu recebia um erro 403 forbidden (via inspetor do Chrome).

Meu logo funciona no canto superior esquerdo do site, no entanto.

Se eu desabilitar manualmente o elemento force https via linha de comando, o logo falha ao carregar, pois estou em modo misto onde o elemento http é bloqueado. Todos os outros elementos do site continuam funcionando.

Eu não fiz nenhuma alteração no reverse nginx. Tentei reconstruir o aplicativo novamente sem sucesso.

Estou sugerindo que algo mudou na forma como o discourse opera nas builds das quais atualizei. Este foi o último ID de build que encontrei que funcionou com a opção force https funcionando: e9f53dbe0028ca7a5d8926711a1944765d34347

Erros capturados agora:

2 curtidas

Olá Andrew - obrigado pelo relatório. Este problema afeta especificamente configurações de proxy reverso onde vários cabeçalhos X-Forwarded-Proto são adicionados à solicitação antes que ela atinja o contêiner do aplicativo.

Acabei de mesclar uma correção em main - ela deve aparecer em tests-passed em cerca de 20 minutos

Assim que aparecer em tests-passed, você precisará fazer uma reconstrução completa (alterações na configuração do nginx não são aplicadas durante atualizações baseadas na interface do usuário).

8 curtidas

Muito obrigado pela resposta rápida e pela correção rápida!

1 curtida

Então, atualização.

Reconstruí o aplicativo com ./launcher rebuild app

Sem problemas nisso.

Os erros desapareceram quando forço o HTTPS com exceção de

Não tenho mais 403 negado, mas, por exemplo, ao tentar fazer login, sou solicitado com a caixa de login que parece aceitar os dados e, em seguida, sou apresentado novamente com um usuário não logado

O mesmo erro acima está presente ao recarregar a página.

Desativei novamente o forçar HTTPS e o site funciona - para clareza, embora os logotipos ainda não estejam sendo oferecidos

1 curtida

Esse erro não está relacionado - ele é causado pela injeção de scripts de análise pelo Cloudflare (e a política de segurança de conteúdo padrão do Discourse bloqueando a injeção)

Você pode compartilhar mais sobre os proxies que você tem entre os usuários e o Discourse? Suponho que o Cloudflare seja a primeira camada? O que mais há entre o Cloudflare e o contêiner do aplicativo Discourse?

3 curtidas

Com certeza!
Você está absolutamente correto. Cloudflare é o primeiro resultado, depois temos o proxy reverso nginx oferecido pelo centminmod para o docker.

Você pode compartilhar a configuração que você tem para isso? Em particular, ele adiciona um cabeçalho X-Forwarded-Proto adicional?

Com certeza!

# Guia de Início Rápido do Centmin Mod
# leia https://centminmod.com/getstarted.html
# Para configuração de SSL HTTP/2
# leia https://centminmod.com/nginx_configure_https_ssl_spdy.html

# redirecionar de www para não-www com SSL forçado
# descomente, salve o arquivo e reinicie o Nginx para habilitar
# se tiver dúvidas, 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 pull de origem autenticado do cloudflare community.centminmod.com/threads/13847/
  #ssl_client_certificate /usr/local/nginx/conf/ssl/cloudflare/exiges.com/origin.crt;
  #ssl_verify_client on;



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

  # antes de habilitar a linha HSTS, leia 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 e manipulador 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;
  # descomente a inclusão de cloudflare.conf se estiver usando cloudflare para
  # site do servidor e/ou 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;
}

Vejo a referência para o cabeçalho x-proto…

   proxy_set_header X-Forwarded-Proto $scheme;
   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
1 curtida

Como o Cloudflare está se conectando à sua origem? Ele está usando SSL/TLS? Idealmente, você deve usar “Full” ou “Full (Strict)” aqui.

Flexível. Tenho sido preguiçoso e não usei certificados de servidor

Eu recomendo que você configure uma das opções SSL seguras do Cloudflare. “Flexível” significa que o tráfego não é criptografado entre o Cloudflare e o seu servidor.

Analisando a configuração novamente:

Parece que você está definindo o cabeçalho como https e, em seguida, definindo-o novamente duas linhas abaixo como $scheme (que será http com base na sua configuração do Cloudflare). Se você remover o segundo, o Discourse será informado de que a conexão é segura (mesmo que não seja).

4 curtidas

Interessante.

O que acho estranho, no entanto, é que estava funcionando.

Suspeito (mas ainda não confirmei 100%) que o contêiner NGINX do Discourse estava anteriormente olhando para o ‘primeiro’ cabeçalho X-Forwarded-Proto. Agora, ele está olhando para o ‘último’ cabeçalho X-Forwarded-Proto, o que é argumentavelmente mais seguro porque vem do proxy ‘mais recente’, que tem mais informações sobre a solicitação de entrada.

Portanto, antes da atualização, ele estava olhando para o X-Forwarded-Proto introduzido pelo Cloudflare (https). Agora, ele está olhando para o cabeçalho X-Forwarded-Proto introduzido pela sua configuração de proxy reverso ‘centminmod’ (http).

3 curtidas

Removi proxy_set_header X-Forwarded-Proto $scheme; da configuração com uma configuração que agora funciona.

Para quem estiver lendo e configurando um centminmod, existem DUAS configurações para o nginx.

Uma para o http e outra para o https.

Removi o segundo proxy_set_header X-Forwarded-Proto $scheme; do site http, e tudo está funcionando como esperado agora.

Este é o meu exiges.com.conf

# Guia de Introdução ao Centmin Mod
# leia em https://centminmod.com/getstarted.html

# redirecionar de não-www para www
# descomente, salve o arquivo e reinicie o Nginx para habilitar
# se tiver dúvidas, 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 & 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;
  # descomente a inclusão de cloudflare.conf se estiver usando cloudflare para
  # servidor e/ou site vhost
  #include /usr/local/nginx/conf/cloudflare.conf;
  include /usr/local/nginx/conf/503include-main.conf;

  # impedir acesso a diretórios e arquivos ./
  #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 comuns, injeções de sql etc
#include /usr/local/nginx/conf/block.conf;

  # Habilita listagens de diretórios quando o arquivo de índice não é encontrado
  #autoindex  on;

  # Mostra os horários da listagem de arquivos como hora local
  #autoindex_localtime on;

  # Exemplo de Permalinks do 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 é o meu exiges.com.conf.ssl

# Guia de Introdução ao Centmin Mod
# leia em https://centminmod.com/getstarted.html
# Para configuração SSL/HTTP/2
# leia https://centminmod.com/nginx_configure_https_ssl_spdy.html

# redirecionar de www para não-www com SSL forçado
# descomente, salve o arquivo e reinicie o Nginx para habilitar
# se tiver dúvidas, 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 pull de origem autenticado pelo cloudflare community.centminmod.com/threads/13847/
  #ssl_client_certificate /usr/local/nginx/conf/ssl/cloudflare/exiges.com/origin.crt;
  #ssl_verify_client on;



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

  # antes de habilitar a linha HSTS, leia 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 & 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;
  # descomente a inclusão de cloudflare.conf se estiver usando cloudflare para
  # servidor e/ou 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 seu tempo é imensamente apreciado para corrigir este problema.

Para que valha a pena, agora estou completo, não flexível com os certificados.

1 curtida

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