Tomcat a uživatelské SSL certifkáty

Po nějaké době jsem se zase setkal s požadavkem na zabezpečení Tomcat serveru, tak aby na HTTPS mohl přistupovat pouze klient, který má správným SSL certifikát v browseru. Dělal jsem to několikrát, ale už je to trochu dýl a neměl jsem o tom žádný zápis, proto jsem napsal tento článek.

Návod na použité SSL v Tomcatu najdete na jeho domácím webu v dokumentaci.

Pro povolení HTTPS je třeba upravit konfigurační soubor server.xml, odkomentujte nebo tam dopište následující záznam. Předpokládám, že server běží pod uživatelem tomcat.

  <Connector port="8443" maxHttpHeaderSize="8192"
         maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
         enableLookups="false" disableUploadTimeout="true"
         acceptCount="100" scheme="https" secure="true"
         clientAuth="true" sslProtocol="TLS" keystorePass="HESLICKO" />
  • keystorePass: heslo k ~tomcat/.keystore
  • clientAuth: povolení nebo zakázání autorizace klientů x509 certifikátama

Certifikát certifikační autority (ca.crt, ca.key) jsem měl už z dřívější doby a použiju ho dál pro podepisování klientských certifikátů.


Certifikát pro server

Vygenerování požadavku na certifikát pro server

keytool -genkey -alias tomcat -keyalg RSA -keystore ~tomcat/.keystore

vyexportování požadavku do .csr souboru

keytool -certreq -keyalg RSA -alias tomcat -file certreq.csr -keystore ~tomcat/.keystore

certifikační autorita podepíše certifikát

openssl x509 -CA cert/ca.crt -CAkey cert/ca.key -CAserial ca/serial \
 -req -in csr/server.req.csr -out cert/client/server.crt -days 365

Import certifikátu certifikační autority

keytool -import -alias root -keystore ~tomcat/.keystore \
 -trustcacerts -file ca.crt

Pokud se chcete ověřovat certifkátama, je třeba přidat certifikát CA do $JAVA_HOME/jre/lib/security/cacerts (defaultni heslo je "changeit" :-) ):

keytool -import -alias root -keystore $JAVA_HOME/jre/lib/security/cacerts \
 -trustcacerts -file ca.crt

Import našeho certifikátu, který jsme dostali od CA na základě našeho requestu

keytool -import -alias tomcat -keystore ~tomcat/.keystore \
 -trustcacerts -file certifikat.crt

Je dobré zkontrolovat co je v .keystore pomocí

keytool -list

Certifikáty pro uživatele (do prohlížeče)

vygenerovani pozadavku

openssl req -new -newkey rsa:1024 -nodes -out client1.req -keyout client1.key

podepíšeme žádost

openssl x509 -CA ca.crt -CAkey ca.key -CAserial demoCA/serial \
 -req -in client1.req -out client1.pem -days 365

vygenerujeme pkcs12 formát

openssl pkcs12 -export -clcerts -in client1.pem -inkey client1.key \ 
-out client1.p12 -name "my_client_certificate"

a ten naimportujeme do browseru, do browseru se take musi naimportovat certifkat CA (ca.crt)