Zestawienie połączenia HTTPS pomiędzy Apache Tomcat a klientami

HTTPS to szyfrowana wersja protokołu HTTP, która zabezpiecza dane wymieniane pomiędzy serwerem a klientem. W niniejszym wpisie pokażę w jaki sposób włączyć obsługę HTTPS w kontenerze Apache Tomcat oraz jak skonfigurować aplikacje klienckie.

Poprawna konfiguracja HTTPS wymaga, aby serwer posiadał „dokumenty”, które to będzie przedstawiał przy łączeniu się do źródeł wrażliwych danych. Takim dokumentem jest certyfikat, który możemy wygenerować za pomocą keytool.

Apache Tomcat

Warto zauważyć, że w przypadku „własnoręcznie” wygenerowanego certyfikatu użytkownicy będą przed nim ostrzegani. Certificate Authorities (CAs) to instytucje zajmujące się generowaniem certyfikatów, które potwierdzają nie tylko źródło jego pochodzenia, ale również i właściciela.

W celu wygenerowania certyfikatu, który w zbiorze /home/.keystore będzie reprezentowany aliasem tomcat używamy następującej komendy:

$JAVA_HOME/bin/keytool genkey alias tomcat keyalg RSA keystore /home/.keystore ext san=ip:{server_ip}

-ext san=ip:{server_ip} używamy, gdy generujemy certyfikat, dla serwera, do którego dostęp odbywa się wyłącznie poprzez adres IP.

Następnym krokiem jest dodanie nowego elementu w sekcji Service w pliku konfiguracyjnym kontenera Tomcat (server.xml):

Zmienne keystoreFile (plik, który podawaliśmy we fladze keystore przy generowaniu certyfikatu) oraz password powinny zostać zamienione na dane podane w poprzednim kroku.

Po restarcie Tomcat’a będziemy mieli dostęp do portu 8443, który będzie dostępny przez HTTPS.

Aplikacje klienckie

Java cacerts

Kolejnym krokiem jest skonfigurowanie aplikacji tak, aby rozpoznawały nasz certyfikat jako zaufany. Jest to możliwe poprzez dodanie go do zbioru certyfikatów zaufanych. Dla środowiska Javy jest to zbiór o nazwie cacerts.

Przykładem takiej potrzeby jest konieczność włączenia HTTPS dla Central Authentication Service, gdy chcemy wspierać model Single Sign On. Cały ruch musi się odbywać po HTTPS, więc po stronie klienckiej naszej aplikacji powinniśmy oznaczyć certyfikat serwera, na którym uruchomiony jest CAS, jako zaufany.

Na początku musimy eksportować certyfikat do pliku.

$JAVA_HOME/bin/keytool export alias tomcat file /home/tomcat.cer keystore /home/.keystore

W powyższym przykładzie certyfikat o aliasie tomcat ze zbioru /home/.keystore zostanie eksportowany do pliku tomcat.cer.

Gdy mamy już plik z certyfikatem możemy go dodać do zbioru zaufanego:

$JAVA_HOME/bin/keytool import alias tomcat file /home/tomcat.cer keystore /etc/ssl/certs/java/cacerts

Po wykonaniu tej komendy zostaniemy poproszeni o hasło. Domyślne to jest ustawione na changeit.

Flagi ustawiane podczas uruchomienia aplikacji

Alternatywą dla importu certyfikatu do zbioru cacerts jest podanie alternatywnego źródła certyfikatów zaufanych. Możemy to wykonać za pomocą poniższych flag podczas uruchomienia aplikacji:

-Djavax.net.ssl.trustStore={keystoreFile} -Djavax.net.ssl.trustStorePassword={password}

Podsumowanie

Podczas prac z certyfikatami powinniśmy przywiązać dużą uwagę do zbiorów, na których wykonujemy operacje. Przypadku złego importu lub eksportu certyfikatów aplikacje nie będą poprawnie działały o czym będziemy informowani np. wyjątkami w logach.

Przydatne linki

  1. Oficjalna dokumentacja Apache Tomcat – https://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html
  2. Różnica pomiędzy .keystore a cacerts – http://stackoverflow.com/questions/17935619/what-is-difference-between-cacerts-and-keystore

You may also like

Comments