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.
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.
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-certbotJeś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.ovhCertbot 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.ovhTeraz 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 rootKopiujemy 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 # exitWłą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: 8443Jako 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.
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-runDo 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.