Configurar suporte HTTPS com Let's Encrypt

:bookmark: Este é um guia para ativar o HTTPS em uma instalação existente do Discourse usando o Let’s Encrypt. Ele pressupõe uma instalação anterior sem HTTPS habilitado.

:person_raising_hand: Nível de usuário necessário: Administrador do Sistema

:exclamation: Este guia é apenas para instalações existentes onde o HTTPS não está habilitado. Seguir o guia de configuração oficial habilita o HTTPS automaticamente por padrão.

Então, você gostaria de adicionar HTTPS ao seu Discourse totalmente gratuito, graças aos nossos amigos do Let’s Encrypt?

:bell: Tudo mais no seu site está pronto para o HTTPS?

Antes de começar, lembre-se de que, para o HTTPS funcionar corretamente, cada recurso individual na página deve ser compatível com HTTPS. Considere seu CDN, seus logins sociais, seus arquivos de logotipo, qualquer JavaScript de terceiros, imagens, fontes ou CSS — todos eles devem estar disponíveis via HTTPS!

Nota: ./discourse-setup habilitará o Let’s Encrypt. E a partir de março de 2017, você pode executá-lo novamente, pressionar Enter algumas vezes e inserir seu endereço de e-mail; o script incluirá os modelos necessários e inserirá seu e-mail conforme necessário. A menos que você seja um administrador de sistema experiente e saiba um motivo para não fazer isso, você deve executar discourse-setup em vez de ler mais. (Se você instalou o Discourse há muito tempo, ainda pode precisar editar app.yml manualmente.)

Nota: Se o seu Discourse for acessado por meio de algum proxy reverso (por exemplo, Cloudflare), esta configuração não funcionará.

Configurar HTTPS com o Let’s Encrypt

1. Edite app.yml

Acesse o arquivo de configuração do seu Discourse:

cd /var/discourse
nano containers/app.yml
  • Adicione os seguintes modelos:
    templates:
      - "templates/web.template.yml"
      - "templates/web.ssl.template.yml"
      - "templates/web.letsencrypt.ssl.template.yml"
    

:warning: O Discourse é o único site no seu servidor?

Se você já estiver usando web.socketed.template.yml, porque hospeda outros sites na porta 80 no mesmo servidor, pare. Você deve usar um cliente Let’s Encrypt no sistema host; a validação falhará, pois o cliente usado não consegue se vincular aos sockets necessários.

2. Expor portas HTTPS

Garanta que as seguintes portas estejam expostas para tráfego HTTPS:

expose:
  - "80:80"
  - "443:443"

3. Adicione e-mail para o Let’s Encrypt

Insira o endereço de e-mail para notificações do Let’s Encrypt:

env:
  LETSENCRYPT_ACCOUNT_EMAIL: 'seu-email@exemplo.com'

4. Recrie o aplicativo

Aplique as alterações recriando o contêiner:

./launcher rebuild app

5. Valide o HTTPS

Acesse seu site via https://seudominio.com. Se bem-sucedido, você verá seu site protegido com HTTPS.

Revise seus recursos:

  • Garanta que os ativos (por exemplo, imagens, scripts) sejam carregados via HTTPS.
  • Reconfigure logins sociais e CDN para HTTPS conforme necessário.
  • Resolva quaisquer avisos no console do navegador sobre ativos inseguros.

O Discourse habilita automaticamente force_https após uma recriação com um certificado HTTPS válido.

Como funciona?

O modelo usa GitHub - acmesh-official/acme.sh: A pure Unix shell script ACME client for SSL / TLS certificate automation · GitHub, que é

O script shell mais simples para o cliente de certificado gratuito LetsEncrypt

Simples e Poderoso, você precisa apenas de 3 minutos para aprender.

Escrito puramente em bash, sem dependências de python, acme-tiny ou cliente oficial do LetsEncrypt. Apenas um script para emitir e renovar seus certificados automaticamente.

Provavelmente é o menor, mais fácil e mais inteligente script shell para emitir e renovar automaticamente os certificados gratuitos do LetsEncrypt.

web.letsencrypt.ssl.template.yml adiciona um script de inicialização ao seu contêiner que

  1. Inicia um nginx leve para servir desafios ACME na porta 80 antes que o nginx principal esteja ativo.
  2. Emite tanto um certificado RSA (4096 bits) quanto um ECDSA (ec-256) do Let’s Encrypt usando o modo webroot com /var/www/discourse/public como diretório.
  3. Instala os certificados no diretório /shared/ssl/ que o nginx espera. Ao mesmo tempo, configura um trabalho cron para renovação automática de certificados. Isso renovará automaticamente seus certificados. Nada acontece se os certificados não tiverem expirado. Se um certificado expirar, você receberá um e-mail sobre isso do Let’s Encrypt no endereço de e-mail fornecido durante a configuração.
  4. Define force_https como verdadeiro se certificados válidos forem obtidos.

Solução de problemas

Verificando logs

Se o HTTPS não funcionar, verifique os logs por erros de SSL ou Let’s Encrypt com:

./launcher logs app

Verificando arquivos de certificação

Garanta que os arquivos de certificado e chave estejam no lugar com:

ls -l /var/discourse/shared/standalone/ssl

Você deve ver arquivos como:

  • seudominio.com.cer (RSA)
  • seudominio.com.key (RSA)
  • seudominio.com_ecc.cer (ECDSA)
  • seudominio.com_ecc.key (ECDSA)

Renovando certificados manualmente

Se a renovação automática falhar, você pode reemitir manualmente seus certificados:

./launcher enter app
sv stop nginx
/usr/sbin/nginx -c /etc/nginx/letsencrypt.conf
LE_WORKING_DIR=/shared/letsencrypt DEBUG=1 /shared/letsencrypt/acme.sh --issue -d exemplo.com -k 4096 -w /var/www/discourse/public
LE_WORKING_DIR=/shared/letsencrypt /shared/letsencrypt/acme.sh --installcert -d exemplo.com --fullchainpath /shared/ssl/exemplo.com.cer --keypath /shared/ssl/exemplo.com.key --reloadcmd "sv reload nginx"
LE_WORKING_DIR=/shared/letsencrypt DEBUG=1 /shared/letsencrypt/acme.sh --issue -d exemplo.com --keylength ec-256 -w /var/www/discourse/public
LE_WORKING_DIR=/shared/letsencrypt /shared/letsencrypt/acme.sh --installcert --ecc -d exemplo.com --fullchainpath /shared/ssl/exemplo.com_ecc.cer --keypath /shared/ssl/exemplo.com_ecc.key --reloadcmd "sv reload nginx"
/usr/sbin/nginx -c /etc/nginx/letsencrypt.conf -s stop

Recriando com certificados limpos

Remova os arquivos de certificados antigos e recrie para começar do zero:

rm -rf /var/discourse/shared/standalone/ssl
rm -rf /var/discourse/shared/standalone/letsencrypt
./launcher rebuild app

Limitações

Os certificados do Let’s Encrypt validam apenas o domínio e a criptografia. Eles não confirmam a propriedade ou identidade, o que pode ser sinalizado em alguns navegadores. Para mais detalhes, consulte a comunidade do Let’s Encrypt.

143 curtidas
Setting up Let's Encrypt for multisite
How should I enable letsencrypt while discourse is beside other websites
Cant setting SLL (Let's Encrypt) for Discourse
Add to homescreen banner on Android
How to Set Up SSL in Discourse
Setting up SSL with my domain name and Discourse instance
Issue installing on subdomain
Completely automated SSL certificate generation
German 1&1-hosting user experience?
Problem with my SSL certificate
Replacement for whitelist-iframe
Site throws a blank screen after trying to enable LetsEncrypt
Missing file(discourse.conf) when launching after lets encrypt update?
Missing file(discourse.conf) when launching after lets encrypt update?
My discourse has either been hacked or catfished?
Discourse has stopped opening
Using a certificate when Discourse is installed behind a reverse proxy
Can discourse be installed in private mode
My Forum Is showing "Privacy Error" after upgrading SSL certificate
Using a certificate when Discourse is installed behind a reverse proxy
Why my forum not pop-up "Add to Home screen"(PWA) automatically?
Why my forum not pop-up "Add to Home screen"(PWA) automatically?
HTTPS : issue while trying to set up SSL certification
HTTPS : issue while trying to set up SSL certification
SSL received a record that exceeded the maximum permissible length
Discourse site loads via IP but via domain only header
Why is the Apple Touch Icon loaded via HTTP instead of HTTPS?
Defaultish app won't rebuild
Why is the Apple Touch Icon loaded via HTTP instead of HTTPS?
Why is the Apple Touch Icon loaded via HTTP instead of HTTPS?
Defaultish app won't rebuild
Unable to connect Discourse and WordPress
I have a very difficult problem installing ssl - please help
Not able to access site after letsencrypt cert expiry and rebuild due to IPV6
Cannot connect to IP address and no errors in log
Http logo urls after enabling LetsEncrypt
How to install SSL certificate in Discourse
White blank page on mobile app
Cloud installation not working
My forum goes offline after removing https
Trying to use Let's Encrypt + Cloudflare
New user invite links only give ERR_SSL_PROTOCOL_ERROR
[DigitalOcean] hostname having "www" in A records showing blank page
Error at LetsEncrypt validation
Migrate a phpBB3 forum to Discourse
Set Up Let's Encrypt with Second Domain for Existing Discourse Install
Not starting up after rebuild
Port 443 of computer does not appear to be accessible
Make auto-linked URLs use HTTPS
Unable to change domain name
LetsEncrypt certificate not renewing
How to deny request from unauthorized domain pointing to my IP address?
No login is possible after recovery a Discourse Backup on a new server
Letsencrypt issued on every build?
My Discourse is Down. Certificate Issue?
Setup Let’s Encrypt + non-www > www
No connection accepted on http / https after fresh installation on Ubuntu 22.04 LTS
SSL certificate expired and after that - Error 404 Not Found
SSL didn't renew automatically and I can't manually renew it
443 address already in use? Letencrypt
Set up Let’s Encrypt with multiple domains / redirects
Using Discourse with Cloudflare: Best Practices
./launcher rebuild app error bootstrap failed with exit code 125
Set up Let’s Encrypt with multiple domains / redirects
Uncaught ReferenceError: Discourse is not defined due to Cloudflare Rocket Loader
Let's Encrypt SSL Certificate Not Renewing
Uploads paths have 80 port but protocol is https
Bootstrap error during Discourse install: ENOENT - /etc/runit/1.d/letsencrypt
How to install Discourse in the AWS EC2 Instances(Ubuntu Server LTS)?
Question about the email configuration
Discourse-saml: There was an error authorizing your account
Problem in installing Let's Encrypt SSL for www and non-www
Email not sending out after installation. I need help please
Discourse not starting up: nginx: unable to open supervise/ok: file does not exist
Failed to bootstrap: Failure with receiving network data
Error when installing ssl Let's Encrypt
How to adjust dependencies for https?
Clicking links is stuck in click tracking, shows ERR_FAILED
Minimum needed to get LetsEncrypt working on a GCE instance
Can we install discourse in another container distro?
Problem with my SSL certificate
Cant setting SLL (Let's Encrypt) for Discourse
[PAID] setup ssl - Let's encrypt
Error after moving from HTTP to HTTPS
How to renew Let's Encrypt?
ServiceWorker script evaluation failed due to HTTP (not HTTPS)
Defaultish app won't rebuild
Too many redirects after enabling https