Jetty je oblíbený webový kontejner, který používáme na mnoha projektech především jako vývojový nebo testovací nástroj. Jetty jde jednoduše integrovat do projektu pomocí maven pluginu, dá se snadno startovat, embeddovat, atd. Když už ale potřebujete připravit reálnější testovací prostředí nebo dokonce produkční, je konfigurace HTTPS samozřejmostí. Postup si pochopitelně skoro nikdo nepamatuje z hlavy, takže ho shrnu v krátkém návodu.
Kroky, které potřebujeme provést:
A. Vygenerovat „self-signed certificate“, který poslouží jako základ pro konfiguraci bezpečnosti serverové části. Jako nástroj použijeme keytool utilitu poskytující potřebnou funkcionalitu a je distribuovaná jako součást javovské JDK. Příkaz pro tvorbu potřebného certifikátu může vypadat takto:
keytool -genkey -keyalg RSA -alias jetty -keystore mykeystore.jks -storepass password -validity 360 -keysize 2048
Daný příkaz vytvoří uložiště pro certifikáty tzv. keystore a v něm bude umístěný námi požadovaný certifikát s názvem jetty.
B. Nakonfigurujeme https protokol v souboru jetty-https.xml (standardně se nachází v adresáři etc). Nastavíme zde SSL konektor a port pro komunikaci. Do souboru je důležité přidat následující kus xml:
<Call id="sslConnector" name="addConnector"> <Arg> <New class="org.eclipse.jetty.server.ServerConnector"> <Arg name="server"> <Ref refid="Server" /> </Arg> <Arg name="factories"> <Array type="org.eclipse.jetty.server.ConnectionFactory"> <Item> <New class="org.eclipse.jetty.server.SslConnectionFactory"> <Arg name="next">http/1.1</Arg> <Arg name="sslContextFactory"> <Ref refid="sslContextFactory" /> </Arg> </New> </Item> <Item> <New class="org.eclipse.jetty.server.HttpConnectionFactory"> <Arg name="config"> <Ref refid="tlsHttpConfig" /> </Arg> </New> </Item> </Array> </Arg> <Set name="host"> <Property name="jetty.host" /> </Set> <Set name="port"> <Property name="jetty.tls.port" default="8444" /> </Set> <Set name="idleTimeout">30000</Set> </New> </Arg> </Call>
C. Poté je třeba poupravit konfigurační soubor jetty-ssl.xml, který je zodpovědný za načtení certifikačního uložiště (ten již máme připravený z předchozího kroku). Nastavení vypadá například takto:
<Configure id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory"> <Set name="KeyStorePath"> <Property name="jetty.base" default="." /> <Property name="jetty.keystore" default="etc/keystore/mykeystore.jks"/> </Set> <Set name="KeyStorePassword"> <Property name="jetty.keystore.password" default="mypass"/> </Set> <Set name="TrustStorePath"> <Property name="jetty.base" default="." /> <Property name="jetty.truststore" default="etc/keystore/mykeystore.jks"/> </Set> <Set name="TrustStorePassword"> <Property name="jetty.truststore.password" default="mypass"/> </Set> <Set name="EndpointIdentificationAlgorithm"></Set> <Set name="NeedClientAuth"> <Property name="jetty.ssl.needClientAuth" default="false"/> </Set> <Set name="WantClientAuth"> <Property name="jetty.ssl.wantClientAuth" default="false"/> </Set> <New id="sslHttpConfig" class="org.eclipse.jetty.server.HttpConfiguration"> <Arg> <Ref refid="httpConfig"/> </Arg> <Call name="addCustomizer"> <Arg> <New class="org.eclipse.jetty.server.SecureRequestCustomizer"/> </Arg> </Call> </New> </Configure>
Pokud všechno už máte připravené, můžete otestovat nastavení spuštěním serveru a zobrazením domovské stránky na vámi nastaveném portu. Pro příklad zkuste https://localhost:8444.
Zpět