Create a self-signed certificate for SSL
Background
This article outlines how to create and install SSL keys, CSRs and self-signed certificate into Jetty.
Before you start
If you have received a certificate from an external source skip to the load keys and certificates section.
Generate SSL keys, CSRs and self signed certificates
The following section provides a brief tutorial of creating self-signed certificates via openssl. These steps detail how to generate private key files (.key), certificate signing request file (.csr) and webserver certificate file (.crt) using openssl.
Generate private key
This generates a file called server.key which contains a private key.
$ openssl genrsa -des3 -out server.key 1024
Load keys and certificates
Once you have received a certificate from a CA or client (or a user generated one), it will need to be loaded into the JSSE keystore.
Loading certificates with keytool
Use keytool to load a certificate in PEM form to a keystore. For example, if you have a file called server.crt that contains the certificate the following command loads the certificate above into a custom JSSE keystore in $SEARCH_HOME/web/conf (There will already be a default keystore file in $SEARCH_HOME/web/conf).
$ keytool -keystore <installdir>/web/conf/custom-keystore -import -alias jetty -file server.crt
Configure Jetty to use a custom keystore
To make use of the custom-keystore generated in the previous section, do the following:
Funnelback v15.0 and newer
In Funnelback v15 and newer the search UI binds to both HTTP 80 and HTTPS 443 so you can just change jetty.ssl.* configs to refer to your keystore path and password. This can be done via global.cfg.
Add the following in global.cfg and then restart Jetty and check $SEARCH_HOME/log/ and check jetty logs for details of whether it succeeded or failed.
global.cfg
jetty.ssl.keymanager-password=password
jetty.ssl.keystore-path=web/conf/custom-keystore
jetty.ssl.keystore-password=password
jetty.ssl.truststore-path=web/conf/custom-keystore
jetty.ssl.truststore-password=password
Funnelback v14.2 and earlier
Copy $SEARCH_HOME/web/conf/customiseJettyServers.groovy_example to $SEARCH_HOME/web/conf/customiseJettyServers.groovy the edit as appropriate.
The following shows an example of how the customiseJettyServers.groovy file would be configured to use the custom-keystore.
Restart Jetty and check $SEARCH_HOME/log/ and check jetty logs for details of whether it succeeded or failed.
Example config of customiseJettyServers.groovy:
customiseJettyServers.groovyimport org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import org.eclipse.jetty.server.Connector;
def Map<String, Server> customise(Map<String, Server> servers) {
// This method can customise Jetty servers before they are started by Funnelback
// We may normally use up to three servers
//
// "public" - deploys search interfaces from $SEARCH_HOME/wec/conf/contexts-http on jetty.search_port
// "admin" - deploys search and admin interfaces from $SEARCH_HOME/wec/conf/contexts-https on jetty.admin_port
//
// If jetty.manifoldcf_port is set to a value, we also use
// "manifoldcf" - deploys manifoldcf $SEARCH_HOME/wec/conf/contexts-manifoldcf on jetty.manifoldcf_port
//
// Further servers may be added, servers may be removed, or the configuration settings may be altered
// as required.
//
// For example, to provide more time for the admin server to stop (default is 1000ms), the following could
// uncommented.
//
// servers.get("admin").setStopTimeout(5000);
//
// The following example adds an SSL connector to the public search server (in addition to the standard HTTP one)
//
SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setKeyStorePath("/opt/funnelback/web/conf/custom-keystore");
sslContextFactory.setKeyStorePassword("password");
sslContextFactory.setTrustStorePath("/opt/funnelback/web/conf/custom-keystore");
sslContextFactory.setTrustStorePassword("password");
sslContextFactory.addExcludeProtocols("SSLv3"); // For POODLE
ServerConnector sslConnector = new ServerConnector(servers.get("public"), sslContextFactory);
sslConnector.setPort(443);
servers.get("public").addConnector(sslConnector);
// This method is expected to return the new map of servers to be started.
return servers;