Tomcat - uwierzytelnianie klienta SSL przy pomocy certyfikatu
Jednym z najpewniejszych sposobów uwierzytelniania klienta w architekturze klient-serwer jest uwierzytelnianie za pomocą certyfikatu klienta podpisanego przez wystawcę znanego (zaufanego) na serwerze. Protokół SSL umożliwia zestawienie bezpiecznego połączenia z klientem i serwerem uwierzytelnionymi certyfikatem. Pokażę jak takie połączenie skonfigurować na serwerze Apache Tomcat i przy pomocy przeglądarki Mozilla Firefox. Posłużę się serwerem Tomcat 6 na systemie Windows. Na innych systemach robi się to analogicznie. Postaram się przedstawić tą procedurę z jak największym wykorzystaniem domyślnych opcji (między innymi nie wykorzystując natywnych connectorów).
Najpierw dobrze jest stworzyć własne centrum certyfikacji i wygenerować klucze oraz certyfikaty. Opisałem to w poście Wystawca certyfikatów - CA w OpenSSL i do plików wygenerowanych zgodnie z tym opisem będę się odwoływać. Dokładne wykonanie instrukcji z postu o CA gwarantuje kompatybilność z poniższymi instrukcjami.
Pierwszym krokiem będzie konfiguracja “zwykłego” SSL z uwierzytelnionym jedynie serwerem (czyli takiego z którym na codzień spotykamy się w internecie).
- Importujemy certyfikat naszego CA do keystore użytkownika z którego uruchamiany będzie Tomcat:
keytool -import -alias root -trustcacerts -file cacert.crt
Domyślne hasło do keystore to changeit - Importujemy certyfikat i klucz prywatny serwera:
keytool -importkeystore -srckeystore server.p12 -srcstoretype PKCS12 -alias server -destalias tomcat -destkeypass changeit
Należy zwrócić uwagę, że zmieniamy hasło importowanego klucza na takie jakim jest chroniony docelowy keystore.-alias serverto alias nadany przy tworzeniu pliku server.p12 - W server.xml odkomentowujemy:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />
- Po uruchomieniu serwera powinniśmy powinniśmy się móc połączyć z https://localhost:8443
- Aby przeglądarka nie wyświetlała ostrzeżeń można na stałe zaakceptować certyfikat serwera, albo lepiej - zaimportować certyfikat naszego CA jako zaufany. W Mozilli Firefox robimy to w ten sposób:
- Z main menu: Tools->Options->Advanced->Encryption->View Certificates
- Zakładka Authorities, klikamy Import
- Wybieramy przygotowany plik cacert.crt i klikamy “Open”
- Wybieramy “Trust this CA to identify web sites”
- Klikamy dwa razy OK
Teraz przeglądarka będzie akceptowała wszystkie certyfikaty serwera podpisane przez nasze CA.
Kolejnym krokiem będzie konfiguracja uwierzytelniania klienta przy pomocy certyfikatu.
- W katalogu
%CATALINA_HOME%\conftworzymy pusty keystore w którym będziemy przechowywać zaufane certyfikaty:
keytool -genkey -alias dummy -keyalg RSA -keystore truststore.jks
keytool -delete -alias dummy -keystore truststore.jks
- Importujemy certyfikat CA dla klientów:
keytool -import -v -trustcacerts -alias myca -file cacert.crt -keystore truststore.jks - Dodajemy zmienną środowiskową CATALINA_OPTS tak, żeby była widoczna podczas uruchamiania serwera.
set CATALINA_OPTS=-Djavax.net.ssl.trustStore=/conf/truststore.jks -Djavax.net.ssl.trustStorePassword=password
Property javax.net.ssl.trustStorePassword zawiera hasło do pliku truststore.jks - Zmiana atrybutu connectora
clientAuthna true spowoduje, że serwer nie zezwoli na połączenie bez właściwego certyfikatu klienta. Jeśli ustawimy ją nawantserwer zażąda certyfikatu ale nie odmówi połączenia gdy klient go nie przedstawi. W obu przypadkach można skonfigurować autoryzację na podstawie DN pobranego z certyfikatu. Tak więc w server.xml zmieniamy:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth=“true” sslProtocol=”TLS” />
Po starcie serwera widzimy, że nie możemy połączyć się z https://localhost:8443 - Aby można było się połączyć przy pomocy Mozilla Firefox zaimportujemy certyfikat (wraz z kluczem) klienta do przeglądarki.
- Z main menu: Tools->Options->Advanced->Encryption->View Certificates
- Zakładka “Your Certificates”, klikamy Import
- Wybieramy przygotowany plik client.p12 i klikamy “Open”
- Wpisujemy hasło dla pliku client.p12
- Klikamy trzy razy OK
Tylko przeglądarka z zainstalowanym certyfikatem klienta może połączyć się z serwerem.
Certyfikat klienta zawarty w pliku można zastąpić urządzeniem kryptograficznym go przechowującym - na przykład kartą stykową. Jest to jeszcze bezpieczniejszy sposób uwierzytelniania klienta powszechnie stosowany w wielu polskich instytucjach państwowych.
Wkrótce opiszę jak wykonać taką konfigurację dla IBM Websphere Application Server.
Komentarze
2 komentarzy do “Tomcat - uwierzytelnianie klienta SSL przy pomocy certyfikatu”
Chcesz coś napisać?
Świetny artykuł, prosto i na temat. Zamierzam go wykorzystać w zakresie realizacji bezpiecznych usług WS w środowisku .NET. Ciekawi mnie obietnica kolejnego artykułu o zabezpieczeniach w Websphere.
Gratuluję konsekwencji, nie każdy autor obiecuje i dotrzymuje słowa, ale ja to rozumiem, jest tyle ciekawych rzeczy do zrobienia a tak krótki dzień.
Dziękuję za przypomnienie. Zastanawiam się tylko czy pisać na temat WAS 6 czy 7 bo stopień trudności konfiguracji SSL w tych dwóch wersjach jak i sama konfiguracja całkowicie się różnią.