Serwer Amazon EC2 i SSL od Let’s encrypt w aplikacji Spring Boot

blog.mloza.pl 2 lat temu

Szyfrowanie ruchu HTTP jest już standardem. Przeglądarki często blokują dużo funkcji, jeżeli nasza aplikacja nie używa SSL do komunikacji pomiędzy frontendem, a backendem. Let’s encrypt pozwala na wygenerowanie takiego certyfikatu całkiem za darmo. Jest on co prawda istotny tylko przez 3 miesiące, ale możemy go bez problemu odnowić. W poście przyjrzymy się jak możemy taki certyfikat wygenerować dla naszej aplikacji w Spring Boocie uruchomionej na serwerze EC2 w AWS.

Domena

Let’s encrypt nie pozwala na generowanie certyfikatów dla domen amazonowych (tych automatycznie przypisywanych do serwera przy utworzeniu go jak np. ec2-54-221-22-192.compute-1.amazonaws.com). Dlatego musimy mieć własną domenę. Możesz ją wykupić na przykład w OVH.pl, nowa domena .pl kosztuje 10zł, a odnowienie około 50zł. jeżeli potrzebujesz domeny do testów, możesz wykupić rozszerzenie .ovh, rejestracja kosztuje około 12zł, a odnowienie 15zł.

Jeśli już mamy naszą domenę musimy ją skonfigurować. Możemy ją dodać do Route 53 w AWS, niestety tam płacimy $0.5 na miesiąc za domenę. Możemy skorzystać z innego dostawcy serwerów DNS. W OVH mamy możliwość korzystania z ich serwerów w cenie domeny i możemy tam konfigurować dowolnie wpisy DNS.

Aby domena wskazywała na nasz serwer, musimy dodać do domeny rekord A wskazujący na IP naszego serwera. Mój serwer ma adres IP 54.221.22.192, adres możesz sprawdzić w panelu AWS. Użyję domeny subdomeny ec2.loza.ovh w domenie loza.ovh. Dodanie wpisu w panelu administracyjnym OVH będzie wyglądać jak poniżej.

Dodawanie rekordu DNS do domeny

Po konfiguracji trzeba odczekać kilka minut i możemy sprawdzić, czy nasz serwer jest widoczny pod domeną. Moja aplikacja już działa na serwerze, więc mogę otworzyć przeglądarkę i sprawdzić co dostanę w odpowiedzi.

Wyjście z aplikacji, na razie strona bez SSL.

Dostaję odpowiedź z serwera. Jak widzisz, pasek adresu pokazuje, iż komunikacja z moją stroną jest niezabezpieczona. Zróbmy coś z tym.

Instalowanie potrzebnych pakietów

Przed przystąpieniem do generowania certyfikatu będziemy musieli zainstalować certbota. Aby to zrobić, potrzebujemy dodać źródło pakietów do rejestru. Wpisujemy kolejno polecenia:

$ wget -O epel.rpm –nv https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm $ sudo yum install -y ./epel.rpm $ sudo yum install python2-certbot

Jeśli instalacja się zakończy, możemy przejść do generowania certyfikatu dl naszej aplikacji.

Generowanie certyfikatu

Certyfikat generujemy wydając poniższe polecenie. Jako parametr -d podajemy domenę, dla której chcemy wygenerować certyfikat.

sudo certbot-2 certonly --standalone -d ec2.loza.ovh

Certbot musi wystartować serwer na porcie 80, więc musisz się upewnić, iż jest on wolny. Po wpisaniu polecenia musimy podać mail. Na podany adres będą przychodzić przypomnienia o przedłużeniu certyfikatu. Do mnie na razie nie przyszedł żaden inny spam. Następnie musimy zaakceptować regulamin (to jest wymagane) i odpowiedzieć na pytanie, czy chcemy przekazać nasze email do fundacji Electronic Frontier Foundation (jest to opcjonalne i nie musimy się zgadzać).

Po przejściu procedury nasze certyfikaty zostały wygenerowane i zapisane w folderze /etc/letsencrypt/live/ec2.loza.ovh/. Teraz musimy je jeszcze przekonwertować do formatu obsługiwanego przez javę.

Konwersja certyfikatu

Aby dostać się do folderu z certyfikatami, musimy być zalogowani jako root. Następnie zmieniamy katalog na katalog z certyfikatami.

$ sudo su # cd /etc/letsencrypt/live/ec2.loza.ovh

Teraz możemy przejść do konwersji certyfikatu. Musimy wydać polecenie jak poniżej. Jako name możemy ustawić dowolną wartość, potem musimy ją podać w konfiguracji aplikacji. Podczas konwersji będziemy poproszeni o ustawienie hasła do certyfikatu. Możemy je zostawić puste.

# openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out keystore.p12 -name backend -CAfile chain.pem -caname root

Kopiujemy certyfikat do katalogu z aplikacją i zmieniamy właściciela na naszego użytkownika, tak aby miał on dostęp do certyfikatu. Potem możemy już wyjść z powłoki roota.

# cp keystore.p12 /home/ec2-user/ # cd /home/ec2-user/ # chown ec2-user keystore.p12 # exit

Włączanie SSL w aplikacji Spring Boot

Aby włączyć obsługę SSL w aplikacji Spring Boot, musimy podać kilka parametrów w application.yml. Możemy stworzyć ten plik w katalogu z plikiem jar, zostanie on automatycznie połączony z plikiem znajdującym się w aplikacji. Dodajemy następujące parametry:

server: ssl: key-store: keystore.p12 key-store-password: key-store-type: pkcs12 key-alias: backend key-password: port: 8443

Jako key-alias podajemy wartość, którą ustawiliśmy przy konwersji certyfikatu.

Teraz możemy już uruchomić naszą aplikację. Pamiętaj, iż musisz mieć otwarty port 8443 w security grupie w AWS. Gdy aplikacja już wystartuje, wpisujemy adres strony w przeglądarce — dla mnie to https://ec2.loza.ovh:8443. Pamiętaj, aby dopisać https://, na tym porcie przeglądarka sama się nie domyśli, iż trzeba użyć SSL i otrzymasz błąd. Po przejściu na stronę możesz zobaczyć kłódkę przy pasku adresu mówiącą nam, iż połączenie jest szyfrowane.

Kłódka przy adresie witryny mówi nam, iż nasze połączenie jest szyfrowane.

Odnowienie certyfikatu

Certyfikaty od Let’s encrypt są ważne przez 3 miesiące. Po tym czasie trzeba je odnowić. Możemy to zrobić, wydając jedno polecenie. Możesz spróbować teraz wykonać dry-run:

sudo certbot-2 renew --dry-run

Do odnowienia też jest potrzebny wolny port 80 wiec, jeżeli coś na nim działa, musisz to najpierw wyłączyć.

Podsumowanie

Aktualnie przeglądarki już wymagają szyfrowania połączenia i jeżeli nie jest ono szyfrowane, użytkownik może otrzymać ostrzeżenie zamiast naszej strony/aplikacji. Certyfikaty od Let’s encrypt są darmowe, więc warto go dodać, jeżeli tworzymy jakąś aplikację. Niestety są one ważne przez 3 miesiące i po tym czasie należy je odnowić. Dostaniemy o tym powiadomienie na maila.

Idź do oryginalnego materiału