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 server to 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%\conf tworzymy 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 clientAuth na true spowoduje, że serwer nie zezwoli na połączenie bez właściwego certyfikatu klienta. Jeśli ustawimy ją na want serwer 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.

Zacheusz Siedlecki

Komentarze

2 komentarzy do “Tomcat – uwierzytelnianie klienta SSL przy pomocy certyfikatu”

  1. Marek on June 13th, 2009 4:47 am

    Ś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ń.

  2. Zacheusz Siedlecki on June 13th, 2009 1:13 pm

    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ą.

Chcesz coś napisać?





*