OAuth2 e Letsencrypt entram em conflito

Tenho um contêiner Docker do Discourse rodando no Ubuntu (criado a partir do template DO) com “OAuth2 Personalizado” ativado. Funciona muito bem, exceto que falha ao atualizar seu certificado Letsencrypt.

Rastreando o problema, vejo nos logs que o script de atualização é executado pelo Cron, mas o desafio é rejeitado porque o Discource redireciona o callback do desafio para o IDP do OAuth2.

Aqui está o log (redigido):
\[Wed Jan 28 12:40:32 PM UTC 2026\] Renewing: ‘community.site’
\[Wed Jan 28 12:40:32 PM UTC 2026\] Renewing using Le_API=https://acme-v02.api.letsencrypt.org/directory
\[Wed Jan 28 12:40:33 PM UTC 2026\] Using CA: https://acme-v02.api.letsencrypt.org/directory
\[Wed Jan 28 12:40:33 PM UTC 2026\] Single domain=‘community.site’
\[Wed Jan 28 12:40:35 PM UTC 2026\] Getting webroot for domain=‘community.site’
\[Wed Jan 28 12:40:35 PM UTC 2026\] Verifying: community.site
\[Wed Jan 28 12:40:36 PM UTC 2026\] Pending. The CA is processing your order, please wait. (1/30)
\[Wed Jan 28 12:40:40 PM UTC 2026\] community.site: Invalid status. Verification error details: 1.2.3.4: Invalid response from https://oauth.site/authorize?client_id=xxx
\[Wed Jan 28 12:40:40 PM UTC 2026\] Please check log file for more details: /shared/letsencrypt/acme.sh.log
\[Wed Jan 28 12:40:40 PM UTC 2026\] Error renewing community.site.

Reconstruir o aplicativo corrige o problema pelos próximos 3 meses, mas eu gostaria de consertá-lo adequadamente. Alguma sugestão?

Agradeço antecipadamente.

Não tenho certeza se vejo algo óbvio aqui, mas honestamente eu apenas colocaria a configuração atrás de um proxy reverso e encerraria o ssl lá, depois usaria a validação DNS. (isso é apenas uma solução alternativa, não uma solução porque o problema é desconhecido)

Mais informações sobre o problema:
Consigo ver a requisição acme-challenge de entrada para http://community.site/.well-known/…
Ela é redirecionada para https://community.site/ e depois redirecionada para /oauth_basic. O segundo redirecionamento é totalmente esperado, mas não o primeiro.
A requisição de desafio de entrada aparece no access.log, o access.letsencypt.log está vazio.

Encontrei um /etc/nginx/conf.d/outlets/before-server/20-redirect-http-to-https.conf que parece sempre retornar 301 https://community.site para qualquer requisição para a porta 80.

Esse problema foi corrigido em agosto passado, letsencrypt updates: renew location for .well-known, add support for … · discourse/discourse_docker@ae4887a · GitHub

2 curtidas

Interessante, eu reconstruí o aplicativo em 26 de novembro, então eu esperaria que a correção já estivesse incluída até então…

De qualquer forma, obrigado a todos pela ajuda. Vamos fechar o tópico e torcer para que o problema não retorne após a próxima reconstrução.

Ah, vejo que havia mais a isso, você pode ler sobre isso aqui até o final desse tópico e então verá que houve outra correção em 22 de dezembro. Então isso explica por que você a encontrou.

2 curtidas

Olhei o commit, eu o tenho instalado. Mas acho que há um erro aí.

return 301 https://${DISCOURSE_HOSTNAME}$request_uri;
deve ser
return 301 https://${DISCOURSE_HOSTNAME}\\$request_uri;
Por favor, me corrija se eu estiver errado.

É exatamente o que a outra correção que mencionei corrige

2 curtidas

Obrigado novamente, muito útil!

1 curtida