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.