I had a hellacious time updating the certificate on my Dockerized Discourse server — the acme.sh script doesn’t have a slash delimiter between the hostname and the ./well-known folder within the URI. Which means the request fails. Repeatedly.
[Sat Oct 10 00:01:09 UTC 2020] _post_url='https://acme-v02.api.letsencrypt.org/acme/chall-v3/7784162898/nr42-g' [Sat Oct 10 00:01:09 UTC 2020] _CURL='curl -L --silent --dump-header /shared/letsencrypt/http.header -g ' [Sat Oct 10 00:01:10 UTC 2020] _ret='0' [Sat Oct 10 00:01:10 UTC 2020] code='200' [Sat Oct 10 00:01:10 UTC 2020] trigger validation code: 200 [Sat Oct 10 00:01:10 UTC 2020] sleep 2 secs to verify [Sat Oct 10 00:01:12 UTC 2020] checking [Sat Oct 10 00:01:12 UTC 2020] url='https://acme-v02.api.letsencrypt.org/acme/chall-v3/7784162898/nr42-g' [Sat Oct 10 00:01:12 UTC 2020] payload [Sat Oct 10 00:01:12 UTC 2020] POST [Sat Oct 10 00:01:12 UTC 2020] _post_url='https://acme-v02.api.letsencrypt.org/acme/chall-v3/7784162898/nr42-g' [Sat Oct 10 00:01:12 UTC 2020] _CURL='curl -L --silent --dump-header /shared/letsencrypt/http.header -g ' [Sat Oct 10 00:01:13 UTC 2020] _ret='0' [Sat Oct 10 00:01:13 UTC 2020] code='200' [Sat Oct 10 00:01:13 UTC 2020] discourse.example.com:Verify error:Fetching https://discourse.example.com.well-known/acme-challenge/XY02T_40TL92IADByQ45JMj4JzC2qJCatVd2odJMAlU: Invalid host in redirect target [Sat Oct 10 00:01:13 UTC 2020] pid [Sat Oct 10 00:01:13 UTC 2020] No need to restore nginx, skip.
Turns out that’s my bad config — I’ve got a reverse proxy in front of Discourse, and we don’t use the clear text http site. The reverse proxy just bounces you over to the https site. Two problems — one, I failed to put the trailing slash after my redirect, s http://discourse.example.com/.well-known/blah is being redirected to https://discourse.example.com.well-known/blah
<VirtualHost 10.1.2.3:80> ServerName discourse.example.com ServerAlias discourse Redirect 301 / https://discourse.example.com </VirtualHost>
That’s easy enough to fix — add the trailing slash I should have had anyway. But the subsequent problem is that the bootstrap nginx config that is used to serve up the validation page only listens on port 80. So I cannot redirect the clear-text traffic over to the SSL site. I have to reverse proxy the clear text site as well (at least whenever the certificate needs to be renewed).
ProxyPass / https://discourse.example.com/ ProxyPassReverse / https://discourse.example.com/
Voila, a web server with an updated certificate.