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
)