Scontro tra OAuth2 e Letsencrypt

Ho un container Docker di Discourse in esecuzione su Ubuntu (creato dal modello DO) con “Custom OAuth2” abilitato. Funziona molto bene, tranne per il fatto che non riesce ad aggiornare il suo certificato Letsencrypt.

Rintracciando il problema, vedo dai log che lo script di aggiornamento viene eseguito da Cron, ma la verifica viene rifiutata poiché Discource reindirizza il callback di verifica all’Identity Provider (IDP) OAuth2.

Ecco il log (redatto):
\[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.

La ricostruzione dell’app risolve il problema per i prossimi 3 mesi, ma vorrei risolverlo correttamente. Qualche suggerimento?

Grazie in anticipo.

Non sono sicuro di vedere qualcosa di ovvio qui, ma onestamente metterei la configurazione dietro un proxy inverso e terminerei la ssl lì, quindi userei la validazione DNS invece. (questa è solo una soluzione temporanea, non una soluzione perché il problema è sconosciuto)

Maggiori informazioni sul problema:
Vedo la richiesta in arrivo di acme-challenge a http://community.site/.well-known/…
Viene reindirizzata a https://community.site/ e poi reindirizzata a /oauth_basic. Il secondo reindirizzamento è del tutto previsto, ma non il primo.
La richiesta di challenge in arrivo appare in access.log, access.letsencypt.log è vuoto.

Ho trovato un file /etc/nginx/conf.d/outlets/before-server/20-redirect-http-to-https.conf che sembra restituire sempre 301 https://community.site per qualsiasi richiesta alla porta 80.

Quel problema è stato risolto lo scorso agosto, letsencrypt updates: renew location for .well-known, add support for … · discourse/discourse_docker@ae4887a · GitHub

2 Mi Piace

Interessante, ho ricostruito l’app il 26 novembre, quindi mi aspetterei che la correzione fosse inclusa entro tale data…

Comunque, grazie a tutti per l’aiuto. Chiudiamo l’argomento e speriamo che il problema non si ripresenti dopo la prossima ricostruzione.

Ah, vedo che c’era dell’altro, puoi leggerlo qui fino alla fine di quell’argomento e poi vedrai che c’è stata un’altra correzione il 22 dicembre. Quindi questo spiega perché l’hai riscontrato.

2 Mi Piace

Ho controllato il commit, l’ho installato. Ma penso che ci sia un errore lì.

return 301 https://${DISCOURSE_HOSTNAME}$request_uri;
dovrebbe essere
return 301 https://${DISCOURSE_HOSTNAME}\\$request_uri;
Per favore, correggimi se sbaglio.

È esattamente ciò che la altra correzione che ho menzionato risolve

2 Mi Piace

Grazie ancora, molto utile!

1 Mi Piace