Brak wdrożonego HTTPS w Spring lub dowolnej innej aplikacji działającej po stronie serwera stanowi poważną lukę w bezpieczeństwie. Zwłaszcza kiedy nasza aplikacja wymaga od użytkownika podawania danych wrażliwych takich jak hasło, dane karty płatniczej, itp.
Dlatego w tym artykule wyjaśnię Ci:
- jakie znaczenie ma połączenie szyfrowane;
- pokażę sposób na utworzenie podpisu cyfrowego z wykorzystaniem algorytmu RSA;
- wdrożenie podpisu cyfrowego w ramach aplikacji napisanej w Spring Boot.
Czym jest HTTPS i po co HTTPS?
HTTPS to szyforwana wersja protokołu HTTP. Bezpieczeństwo i integralność danych zapewnia TLS (Transport Layer Secure). A zatem można wykorzystać wzór:
HTTPS = HTTP + TLS
HTTPS zapewnia szyfrowaną komunikację pomiędzy użytkownikiem a serwerem aplikacji. W przypadku kiedy go nie zapewnimy, to cała komunikacja jest jawna!
Rozpatrzmy przypadek – „Niezabezpieczony Janusz” korzysta z aplikacji niezabezpieczonej przez HTTPS. Następnie wypełnia formatkę logowania klikając przycisk „zaloguj”. W efekcie przesyła w sposób jawny login i hasło, które w łatwy sposób jest podejrzeć, bo nie są w żaden sposób chronione.
Z pewnością lepiej postąpi „Pomysłowy Dobromir”, który korzysta z aplikacji zabezpieczonej prze TLS. W rezultacie osoba podsłuchująca sieć będzie mogła zobaczyć jedynie pomiędzy jakimi urządzeniami odbywa się ruch sieciowy. Natomiast samego hasła, loginu, ani konkretnych podstron nie pozna.
Jak wygenerować samopodpisany certyfikat?
Aby zapewnić szyfrowaną komunikacje potrzebujemy certyfikat. Certyfikaty są wydawane przez Urząd Certyfikacji, po to, aby były zaufane przez przeglądarkę, która wówczas w pasku adresu wyświetli zieloną kłódkę:
Możliwe jest również wydanie własnego certyfikatu, który nie będzie wiarygodny, jednak zapewni nam szyfrowaną komunikacje. Godne uwagi jest to, że JRE zapewnia możliwość wygenerowania takiego certyfikatu. Dlatego w tym celu należy się udać do katalogu:
Java > JRE > bin i odnaleźć plik keytool.exe
W następnej kolejności uruchamiamy terminal z prawami administratora i wykonujemy polecenie:
.\keytool.exe -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -validity 365 -keysize 2048
Po tym zostaniemy spytani o dodatkowe informacje:
Po tych czynnościach wygeneruje się klucz keystore.jks w tym samym katalogu.
Konfiguracja HTTPS w Spring
Utworzony plik keystore.jks dodaj do katalogu resource w projekcie Spring Boot. Natomiast w pliku application.properties uwzględnij następujące rekordy:
server.port=443 server.ssl.key-password=password server.ssl.key-store-password=password server.ssl.key-store=src/main/resources/keystore.jks
Zmiana portu na 443 jest bardzo ważna, ponieważ jest to domyślny port szyfrowany. Kolejne rekordy należy wypełnić zgodnie z wartościami podawanymi w trakcie generowania pary kluczy z poziomu konsoli.
Finalnie możesz uruchomić aplikacje, pamiętając o dodaniu httpS:
https://localhost:443
Od teraz połączenie jest szyfrowane, a Ty możesz sprawdzić swój certyfikat w przeglądarce 😉
Podsłuch niezabezpieczonej aplikacji
W wideo-materiale pokazuje w jaki sposób dokonać podsłuchu aplikacji niezabezpieczonej przez HTTPS. Również krok po kroku pokazuje jak prawidłowo skonfigurować aplikacje napisaną w Spring Boot, aby była bezpieczniejsza 😉
Stosowanie HTTPS – Wnioski
Pamiętaj, że wszelkie starania zapewniające bezpieczeństwo w ramach odpowiedniego składowania, oraz szyfrowania danych użytkownika są daremne, jeśli nie zabezpieczymy odpowiednio połączenia z naszą aplikacją 😉