Odnawianie Let's Encrypt bez wyłączania serwera

W październiku pisałem o tym jak to postawiłem swój serwer WWW i użyłem Let’s Encrypt aby uzyskać certyfikat SSL. Minęło już pół roku, więc po raz drugi odnawiałem certyfikat i trochę zabolało mnie to zdanie:

Należy się jeszcze upewnić, że port 80 jest wolny (zatrzymać nasze proxy).

Nie chcę wyłączać mojej usługi na czas aktualizacji certyfikatu. Co więc mogę zrobić?

Jak w ogóle działa proces odnowienia certyfikatu? Otóż klient Let’s Encrypt komunikuje się z serwerem CA i ustalają challenge - plik o konkretnej nazwie i zawartości, a następnie CA waliduje czy posiadamy domenę, której certyfikat chcemy przez pobranie tego pliku z

https://mydomain.com/.well-known/acme-challenge/XXXXXXXXXXXX

Więc normalnie musielibyśmy zatrzymać nasz serwer WWW, żeby letsencrypt mógł postawić swój serwer i odpowiedzieć na to żądanie.

Ja natomiast zacząłem myśleć czy by nie dało się tego obejść. Skoro i tak mam reverse proxy, to mogę je skonfigurować aby przepuszczało żądania z konkretnej ścieżki gdzieś indziej.

Do letsencrypt z flagą --standalone można przekazać dodatkowy parametr - na jakim porcie ma się zbindować.

./letsencrypt-auto certonly --standalone --http-01-port 8080

Wtedy mogę lokalnie odpytać ten serwer o wartość pliku, który jest potrzebny. Wobec tego w mojej konfiguracji NGINX dodałem nowy upstream

upstream letsencrypt {
    server 172.17.0.1:8080;
}

Gdzie 172.17.0.1 to IP interfejsu docker0, czyli sposób w jaki kontener może się komunikować z hostem.

A w konfiguracji wirtualnego serwera dodałem

location /.well-known/acme-challenge/ {
    proxy_pass        http://letsencrypt;
}

I w ten sposób mogłem odnowić swój certyfikat bez konieczności zatrzymywania serwera WWW.