Page History
...
Introduction
- Connections from the user 's browsers to the JOC Cockpit can be secured by HTTPS and with TLS/SSL certificates.
- Connections from clients using the JS7 - REST Web Service API to the Controller (that ships with the JOC Cockpit) can be secured by HTTPS with TLS/SSL certificates.
- This article describes the steps required to set up secure HTTPS communication with Jetty and with the JobScheduler Master.the JOC Cockpit. This includes to set up a standalone JOC Cockpit instance or a JOC Cockpit cluster with a number of instances.
- Refer to
- Consider the JS7 - System Architecture article for an overview of components products and connections.
- Consider JobScheduler Universal Agent - HTTPS Agent and Master Authentication for securing the connection between Controller instances and Agents.
Prerequisites
- Certificate stores can be managed from the command line and by use of tools that provide a GUI for this purpose:
- the Java Keytool is available with Java JRE or JDK,
- the Keystore Explorer is an open source utility to graphically manage certificate stores.
Certificate Management
Certificate Management for secure connections of user browsers to the JOC Cockpit
Should JOC Cockpit and JobScheduler Master be operated on the same server then no HTTPS connection between both components is required. To secure the JOC Cockpit user interface for HTTPS access by user browsers the following private key and certificates should be in place:
Flowchart |
---|
browser [label=" User Browser ",fillcolor="lightskyblue"]
JOC [label=" JOC Cockpit ",fillcolor="lightskyblue"]
browser_Truststore [label="User Browser Truststore\ntruststore location is product dependent\n\nCA Certificates",fillcolor="orange"]
JOC_Keystore [label="JOC Cockpit Keystore\n./jetty_base/resources/joc/joc-https.p12\n\nCA Certificates\nJOC Cockpit Private Key\nJOC Cockpit Certificate",fillcolor="orange"]
browser_Truststore_CA_RootCertificate [shape="ellipse",shape="ellipse",label="CA Root Certificate",fillcolor="white"]
JOC_Keystore_CA_RootCertificate [shape="ellipse",shape="ellipse",label="CA Root Certificate",fillcolor="white"]
JOC_Keystore_CA_IntermediateCertificate [shape="ellipse",label="CA Intermediate Certificate",fillcolor="white"]
JOC_PrivateKey [shape="ellipse",label="JOC Cockpit Private Key",fillcolor="white"]
JOC_Certificate [shape="ellipse",label="JOC Cockpit Certificate",fillcolor="white"]
browser -> JOC [label=" establish JOC Cockpit connection "]
browser -> browser_Truststore [label=" use certificate store "]
browser_Truststore -> browser_Truststore_CA_RootCertificate [label=" added to truststore e.g. by Group Policies "]
JOC -> JOC_Keystore
JOC_Keystore -> JOC_Keystore_CA_RootCertificate -> JOC_Keystore_CA_IntermediateCertificate -> JOC_PrivateKey -> JOC_Certificate [label=" add to keystore "]
|
Then proceed with chapter Set up a secure connection of user browsers to the JOC Cockpit
Certificate Management for secure connections of the JOC Cockpit to the JobScheduler Master
Should JOC Cockpit and JobScheduler be operated on different servers then both connections should be secured by HTTPS
- the connection from the user browser to the JOC Cockpit user interface,
- the connection from JOC Cockpit to the Master.
Private keys and public certificates should be distributed as follows:
Flowchart |
---|
browser [label=" User Browser ",fillcolor="lightskyblue"]
Master [label=" JobScheduler Master ",fillcolor="lightskyblue"]
JOC [label=" JOC Cockpit ",fillcolor="lightskyblue"]
browser_Truststore [label="User Browser Truststore\ntruststore location is product dependent\nCA Certificates",fillcolor="orange"]
Master_Keystore [label="Master Keystore\n./config/private/private-https.jks\nMaster Private Key",fillcolor="orange"]
JOC_Truststore [label="JOC Cockpit Truststore\n./jetty_base/etc/joc-https.jks\nCA certificates\nMaster certificates",fillcolor="orange"]
JOC_Keystore [label="JOC Cockpit Keystore\n./jetty_base/etc/joc-https.jks\nCA Certificates\nJOC Cockpit Private Key\nJOC Cockpit Certificates",fillcolor="orange"]
browser_Truststore_CA_RootCertificate [shape="ellipse",shape="ellipse",label="CA Root Certificate",fillcolor="white"]
JOC_Truststore_CA_RootCertificate [shape="ellipse",shape="ellipse",label="CA Root Certificate",fillcolor="white"]
JOC_Truststore_CA_IntermediateCertificate [shape="ellipse",label="CA Intermediate Certificate",fillcolor="white"]
JOC_Keystore_CA_RootCertificate [shape="ellipse",shape="ellipse",label="CA Root Certificate",fillcolor="white"]
JOC_Keystore_CA_IntermediateCertificate [shape="ellipse",label="CA Intermediate Certificate",fillcolor="white"]
Master_PrivateKey [shape="ellipse",label="Master Private Key",fillcolor="white"]
Master_Keystore_Certificate [shape="ellipse",label="Master Certificate",fillcolor="white"]
Master_Truststore_Certificate [shape="ellipse",label="Master Certificate",fillcolor="chartreuse"]
JOC_PrivateKey [shape="ellipse",label="JOC Cockpit Private Key",fillcolor="white"]
JOC_Certificate [shape="ellipse",label="JOC Cockpit Certificate",fillcolor="white"]
Master -> Master_Keystore
Master -> Master_Truststore_Certificate [label=" transfer to JOC Cockpit "]
Master_Keystore-> Master_PrivateKey -> Master_Keystore_Certificate [label=" add to keystore "]
browser -> JOC [label=" establish JOC Cockpit connection "]
browser -> browser_Truststore [label=" use certificate repository "]
browser_Truststore -> browser_Truststore_CA_RootCertificate [label=" added to truststore by Group Policies "]
JOC -> JOC_Keystore
JOC_Keystore -> JOC_Keystore_CA_RootCertificate -> JOC_Keystore_CA_IntermediateCertificate -> JOC_PrivateKey -> JOC_Certificate [label=" add to keystore "]
JOC -> JOC_Truststore
JOC_Truststore -> JOC_Truststore_CA_RootCertificate -> JOC_Truststore_CA_IntermediateCertificate [label=" add to truststore "]
JOC_Truststore_CA_IntermediateCertificate -> Master_Truststore_Certificate [label=" add to truststore "]
|
The Master's private key and certificate are added to the Master's keystore. In case of a self-signed certificate the certificate is added to the JOC Cockpit truststore as well. This step can be skipped if a CA-signed certificate is used as the Root Certificate and Intermediate Certificate in the JOC Cockpit truststore are sufficient to verify any Master certificates.
...
This configuration is applied in order to enable users to access the JOC Cockpit by use of HTTPS with their browser.
In the following the placeholders JOC_HOME
, JETTY_HOME
and JETTY_BASE
are used which locate three directories. If you install Jetty with the JOC installer then
JOC_HOME
is the installation path which is specified during the JOC Cockpit installation:- C:\Program Files\sos-berlin.com\joc (default on Windows)
- /opt/sos-berlin.com/joc (default on Linux)
JETTY_HOME
=JOC_HOME
/jettyJETTY_BASE
is Jetty's base directory which is specified during the JOC Cockpit installation:- C:\ProgramData\sos-berlin.com\joc (default on Windows)
- /home/<setup-user>/sos-berlin.com/joc (default on Linux)
Step 1: Add the HTTPS module to Jetty
On the JOC Cockpit server run the following command and replace the
JETTY_HOME
andJETTY_BASE
placeholders as specified above:Code Block language bash title Add HTTPS module to Jetty java -jar "JETTY_HOME/start.jar" -Djetty.home="JETTY_HOME" -Djetty.base="JETTY_BASE" --add-to-start=https
- Having executed the above command you should find a new folder
JETTY_BASE/etc
- Jetty expects a Keystore in this folder with the name "keystore" by default.
You can copy the
JETTY_HOME/etc/keystore
file toJETTY_BASE/etc/keystore
as a workaround, however, you should use your own Keystore for later on (see step 2). It is not recommended to use the default Keystore as in particular, the Keystore fromJETTY_HOME/etc/keystore
expires after a short lifetime.Warning Jetty doesn't start if it doesn't find a keystore corresponding its settings.
- In addition some entries in the
JETTY_BASE/start.ini
configuration file for SSL settings such as the HTTPS port are added.
Step 2: Create the Java Keystore for Jetty
- On the JOC Cockpit server create the Java Keystore using the Keytools from your Java JRE or JDK.
- Generate the Java Keystore in JKS or PKCS12 format with the private key and public certificate for Jetty. The below examples suggest one possible approach for certificate management, however, there may be other ways how to achieve similar results.
Example for use of self-signed certificate with JKS keystore format
Code Block language bash title Example how to generate a JKS Keystore with private key and public certificate # generate JOC Cockpit private key with alias name "joc-https" in a keystore (joc-https.jks) # use the fully qualified hostname (FQDN) and name of your organization for the distinguished name keytool -genkey -alias "joc-https" -dname "CN=hostname,O=organization" -validity 1461 -keyalg RSA -keysize 2048 -keypass jobscheduler -keystore "JETTY_BASE/etc/joc-https.jks" -storepass jobscheduler
Example for use of self-signed certificate with PKCS12 keystore format
Code Block language bash title Example how to generate a PKCS12 Keystore with private key and public certificate # generate JOC Cockpit private key with alias name "joc-https" in a keystore (joc-https.p12) # use the fully qualified hostname (FQDN) and name of your organization for the distinguished name # consider that PKCS12 keystores require to use the same key password and store password keytool -genkey -alias "joc-https" -dname "CN=hostname,O=organization" -validity 1461 -keyalg RSA -keysize 2048 -keypass jobscheduler -keystore "JETTY_BASE/etc/joc-https.p12" -storepass jobscheduler -storetype PKCS12
Example for use of CA signed certificate with PKCS12 keystore format:
Code Block language bash title Example how to add a CA signed private key and public certificate to a PKCS12 Keystore # should your JOC Cockpit private key and certificate by provided with a .jks keystore (keypair.jks) then temporarily convert the keystore to pkcs12 (keystore.p12) # for later use with openssl, assuming the alias name of the JOC Cockpit private key is "joc-https" # keytool -importkeystore -srckeystore keypair.jks -destkeystore keystore.p12 -deststoretype PKCS12 -srcalias joc-https # assuming your JOC Cockpit private key from a pkcs12 keystore (keystore.p12), store the JOC Cockpit private key to a .key file in PEM format (joc-https.key) openssl pkcs12 -in keystore.p12 -nocerts -out joc-https.key # concatenate CA root certificate and CA intermediate certificates to a single CA Bundle certificate file (ca-bundle.crt) cat RootCACertificate.crt > ca-bundle.crt cat CACertificate.crt >> ca-bundle.crt # Export JOC Cockpit private key (joc-https.key), JOC Cockpit public certificate in PEM format (joc-https.crt) and CA Bundle in PEM format (ca-bundle.crt) to a new keystore (joc-https.p12) # assume the fully qualified hostname (FQDN) of the JOC Cockpit server to be "joc.example.com" openssl pkcs12 -export -in joc-https.crt -inkey joc-https.key -chain -CAfile ca-bundle.crt -name joc.example.com -out joc-https.p12 # should you require use of a .jks keystore type then convert the pkcs12 keystore assuming the alias name of the JOC Cockpit private key to be "joc-https" # keytool -importkeystore -srckeystore joc-https.p12 -srcstoretype PKCS12 -destkeystore joc-https.jks -deststoretype JKS -srcalias joc-https
Explanations
- Replace the
JETTY_BASE
placeholder as specified above. - The
-dname
option specifies the certificate issuer, therefore use your own set of CN, OU, DC that specify the issuer's distinguished name. The O setting is required for the issuer. - The
-keypass
option accepts the password that you will need later on to manage your private key. - The
-keystore
option specifies the location of your Keystore file. - The
-storepass
option specifies the password for access to your Keystore file. - The
-storepass
option is used for the PKCS12 keystore format, this option is not required for the JKS keystore format.
- Replace the
- Generate the Java Keystore in JKS or PKCS12 format with the private key and public certificate for Jetty. The below examples suggest one possible approach for certificate management, however, there may be other ways how to achieve similar results.
- Alternatively apply a private key and certificate that are issued by your organization or a trusted authority.
Step 3: Configure Jetty
Edit the following entries in the JETTY_BASE/start.ini
configuration file corresponding to the Java Keystore:
Code Block |
---|
## Keystore file path (relative to $jetty.base)
jetty.sslContext.keyStorePath=etc/joc-https.jks
## Truststore file path (relative to $jetty.base)
jetty.sslContext.trustStorePath=etc/joc-https.jks
## Keystore password
jetty.sslContext.keyStorePassword=jobscheduler
## KeyManager password (same as keystore password for pkcs12 keystore type)
jetty.sslContext.keyManagerPassword=jobscheduler
## Truststore password
jetty.sslContext.trustStorePassword=jobscheduler |
...
Specify the HTTPS port with the following entry of the JETTY_BASE/start.ini
configuration file (default HTTPS port is 48446):
Code Block |
---|
## Connector port to listen on
jetty.ssl.port=48446 |
- Refer to the JS7 - Controller HTTPS Connections article for information about securing the connections between the JOC Cockpit and Controllers.
- Refer to the JS7 - Agent HTTPS Connections article for information about securing the connections between Controller instances and Agents.
Prerequisites
- The following explanations assume Private CA-signed Certificates or Public CA-signed Certificates to be used.
- Private CA-signed Certificates are created by users who operate their own CA, see the JS7 - How to create X.509 SSL TLS Certificates.
- Public CA-signed Certificates are provided from known and trusted Certificate Authorities (CA) that validate the domain owner.
- Use of Intermediate CA Certificates is optional.
- There is no difference in using a Private CA or Public CA concerning functionality of X.509 certificates, usage for Server Authentication / Client Authentication, or security of connections. The only difference is that users trust the Private CA that they set up on their own.
- Certificate stores can be managed from the command line and by use of tools that provide a GUI for this purpose:
- the Java Keytool is available from the Java JRE or JDK,
- the Keystore Explorer is an open source utility to graphically manage certificate stores.
- Starting from Java 9 the PKCS12 keystore type is default and is not required to be specified with
keytool
. - The following sections assume a PKCS12 keystore/truststore format. For Unix OS the .p12 file extension frequently is used, for Windows OS the .pfx extension is preferably used. Both file extensions indicate the same PKCS12 format and can be used interchangeably.
- The following explanations assume JOC Cockpit starting from release 2.5 to be used. This release introduces Jetty 11. Earlier releases of JOC Cockpit ship with Jetty 9 and make use of a single configuration file
JETTY_BASE/start.ini
instead of separate configuration files JETTY_BASE/start.d/http.ini
,JETTY_BASE/start.d/https.ini
,JETTY_BASE/start.d/ssl.ini
.
Certificate Management
To secure access to JOC Cockpit by clients (user browsers or REST API clients) the following Private Keys and Certificates should be in place:
Flowchart |
---|
Client [label=" Client \n User Browser / REST API Client ",fillcolor="lightskyblue"]
JOC [label=" JOC Cockpit ",fillcolor="lightskyblue"]
#Client_Keystore [label="Client Keystore\nlocation is product dependent\n\nCA Certificates\nPrivate Key / Certificate",fillcolor="limegreen"]
Client_Keystore [label="Client Keystore\nlocation is product dependent\n\nPrivate Key / Certificate",fillcolor="limegreen"]
Client_Truststore [label="Client Truststore\nlocation is product dependent\n\nCA Certificates",fillcolor="orange"]
#JOC_Keystore [label="JOC Cockpit Keystore\nhttps-keystore.p12\n\nCA Certificates\nPrivate Key / Certificate",fillcolor="orange"]
JOC_Keystore [label="JOC Cockpit Keystore\nhttps-keystore.p12\n\nPrivate Key / Certificate",fillcolor="orange"]
JOC_Truststore [label="JOC Cockpit Truststore\nhttps-truststore.p12\n\nCA Certificates",fillcolor="orange"]
#Client_Keystore_CA_RootCertificate [shape="ellipse",label="CA Root\nCertificate",fillcolor="white"]
#Client_Keystore_CA_IntermediateCertificate [shape="ellipse",label="CA Intermediate\nCertificate",fillcolor="white"]
Client_PrivateKey [shape="ellipse",label="Client Authentication\nPrivate Key",fillcolor="white"]
Client_Certificate [shape="ellipse",label="Client Authentication\nCertificate",fillcolor="white"]
Client_Truststore_CA_RootCertificate [shape="ellipse",label="CA Root\nCertificate",fillcolor="white"]
JOC_Truststore_CA_RootCertificate [shape="ellipse",label="CA Root\nCertificate",fillcolor="white"]
#JOC_Keystore_CA_RootCertificate [shape="ellipse",label="CA Root\nCertificate",fillcolor="white"]
#JOC_Keystore_CA_IntermediateCertificate [shape="ellipse",label="CA Intermediate\nCertificate",fillcolor="white"]
JOC_PrivateKey [shape="ellipse",label="Server Authentication\nPrivate Key",fillcolor="white"]
JOC_Certificate [shape="ellipse",label="Server Authentication\nCertificate",fillcolor="white"]
Client -> JOC [label=" establish connection "]
Client -> Client_Truststore
Client_Truststore -> Client_Truststore_CA_RootCertificate [label=" add to truststore \n e.g. by Group Policies "]
Client -> Client_Keystore
#Client_Keystore -> Client_Keystore_CA_RootCertificate -> Client_Keystore_CA_IntermediateCertificate [label=" add to keystore "]
Client_Keystore -> Client_PrivateKey -> Client_Certificate [label=" add to keystore "]
JOC -> JOC_Keystore
#JOC_Keystore -> JOC_Keystore_CA_RootCertificate -> JOC_Keystore_CA_IntermediateCertificate [label=" add to keystore "]
JOC_Keystore -> JOC_PrivateKey -> JOC_Certificate [label=" add to keystore "]
JOC -> JOC_Truststore
JOC_Truststore -> JOC_Truststore_CA_RootCertificate [label=" add to truststore "]
|
Explanation:
- Keystores and truststores shown in orange are required for any connections of clients to JOC Cockpit.
- Keystores and truststores shown in green are required if mutual authentication is in place, e.g. to allow certificate based authentication.
- A JOC Cockpit truststore is required. Should secure connections be used to access a Controller or an LDAP server for authentication/authorization then the truststore will hold the necessary certificates.
- Consider that similar distribution of Private Keys and Certificates applies to each JOC Cockpit instance in a cluster.
Secure Connection Setup
In the following, JOC_HOME
, JETTY_HOME
and JETTY_BASE
placeholders are used which locate three directories. If you install Jetty with the JOC Cockpit installer then:
JOC_HOME
is the installation path that is specified during JOC Cockpit installation:/opt/sos-berlin.com/js7/joc
(default on Unix)C:\Program Files\sos-berlin.com\js7\joc
(default on Windows)
JETTY_HOME
=JOC_HOME
/jetty
JETTY_BASE
is Jetty's base directory that is specified during JOC Cockpit installation:/home/<setup-user>/sos-berlin.com/js7/joc
(default on Unix)C:\ProgramData\sos-berlin.com\js7\joc
(default on Windows)
Secure Connections from Clients to JOC Cockpit
The following steps are applied to enable clients (user browser, REST API client) to access the JOC Cockpit using HTTPS.
Step 1: Adding the HTTPS and SSL modules to Jetty
On the JOC Cockpit server, run the following command and replace the
JETTY_HOME
andJETTY_BASE
placeholders as specified above:Code Block language bash title Add HTTPS module to Jetty java -jar "JETTY_HOME/start.jar" -Djetty.home="JETTY_HOME" -Djetty.base="JETTY_BASE" --add-module=ssl,https
- Having executed the above command users should find a new folder
JETTY_BASE/etc
By default Jetty expects a keystore with the name
keystore
in this folder that has been created from the above command.Jetty doesn't start if it doesn't find a keystore that corresponds to its settings.
- In addition the
JETTY_BASE/start.d/https.ini
andJETTY_BASE/start.d/ssl.ini
configuration files will be created and will be populated with a number of entries for TLS/SSL settings.
Anchor | ||||
---|---|---|---|---|
|
- On the JOC Cockpit server create the keystore using
openssl
and thekeytool
from your Java JRE, JDK or other 3rd-party utility.- For use with a 3rd-party utility create a keystore, e.g.
https-keystore.p12,
in PKCS12 format and import:- the JOC Cockpit Private Key and Certificate for Server Authentication
- the Root CA Certificate
- Intermediate CA Certificate(s)
- The examples below describe a possible approach for certificate management, however, there are other ways to achieve similar results.
Example for importing an existing Private Key and CA-signed Certificate to a keystore:
Code Block language bash title Example how to add a Private Key and CA-signed Certificate to a PKCS12 keystore # Assume the fully qualified domain name (FQDN) of the JOC Cockpit server to be "joc.example.com" # If the JOC Cockpit CA-signed Certificate is provided from a pkcs12 keystore (certificate.p12), extract the JOC Cockpit Certificate to a .crt file in PEM format (joc.example.com.crt) # openssl pkcs12 -in certificate.p12 -nokeys -out joc.example.com.crt # Import the JOC Cockpit Private Key (joc.example.com.key) and JOC Cockpit Certificate (joc.example.com.crt) from PEM format to a new keystore (joc.example.com.p12) openssl pkcs12 -export -in joc.example.com.crt -inkey joc.example.com.key -name joc.example.com -out "JETTY_BASE/resources/joc/https-keystore.p12"
Hide If currentSpace JS7 Code Block language bash title Example how to add a Private Key and CA-signed Certificate to a PKCS12 keystore # If the JOC Cockpit's Private Key and Certificate are provided with a .jks keystore (keypair.jks) then temporarily convert the keystore to pkcs12 (keystore.p12) # for later use with openssl, assuming the alias name of the JOC Cockpit Private Key being "joc.example.com" # keytool -importkeystore -srckeystore keypair.jks -srcstoretype JKS -destkeystore keystore.p12 -deststoretype PKCS12 -srcalias joc.example.com # Assuming the JOC Cockpit Private Key from a pkcs12 keystore (keystore.p12), store the JOC Cockpit Private Key to a .key file in PEM format (joc-https.key) openssl pkcs12 -in keystore.p12 -nocerts -out joc-https.key # Concatenate the CA Root Certificate and optionally CA Intermediate Certificates to a single CA Bundle certificate file (ca-bundle.crt) cat RootCACertificate.crt > ca-bundle.crt cat CACertificate.crt >> ca-bundle.crt # Export the JOC Cockpit Private Key (joc-https.key), JOC Cockpit Certificate (joc-https.crt) and CA Bundle (ca-bundle.crt) in PEM format to a new keystore (https-keystore.p12) # assume the fully qualified domain name (FQDN) of the JOC Cockpit server to be "joc.example.com" openssl pkcs12 -export -in joc-https.crt -inkey joc-https.key -chain -CAfile ca-bundle.crt -name joc.example.com -out "JETTY_BASE/resources/joc/https-keystore.p12" # If you require use of a .jks keystore type then convert the pkcs12 keystore, assuming the alias name of the JOC Cockpit Private Key to be "joc.example.com" # keytool -importkeystore -srckeystore https-keystore.p12 -srcstoretype PKCS12 -destkeystore https-keystore.jks -deststoretype JKS -srcalias joc.example.com
Example for creating a Private Key and CA-signed Certificate and importing to a keystore
Refer to examples available from JS7 - How to create X.509 SSL TLS Certificates, chapter Creating SSL/TLS Server Certificates.
- For use with a 3rd-party utility create a keystore, e.g.
Step 4: Deactivate HTTP Access
To deactivate HTTP access simply add a comment to the following module directive in your JETTY_BASE/start.ini
configuration file like this:
Code Block |
---|
# Module: http
# --module=http |
...
This configuration is applied in order to secure the connection if JOC Cockpit and JobScheduler Master are not operated on the same server. If not otherwise stated then the steps for HTTPS configuration are performed on the server that hosts the JobScheduler Master.
Step 1: Create the Java Keystore
- On the JobScheduler Master server create the Java Keystore using the Keytools from your Java JRE or JDK. The below examples suggest one possible approach for certificate management, however, there may be other ways how to achieve similar results.
- Generate the Java Keystore with the private key and the public certificate for the JobScheduler Master and export the certificate to a second Keystore that is later on used by the JOC Cockpit.
Example for use of self-signed certificate with JKS keystore format
Code Block language bash title Example how to generate a JKS Keystore with private key and public certificate # generate Master private key with alias name "master-https" in a keystore (private-https.jks) # use the fully qualified hostname (FQDN) and name of your organization for the distinguished name keytool -genkey -alias "master-https" -dname "CN=hostname,O=organization" -validity 1461 -keyalg RSA -keysize 2048 -keypass jobscheduler -keystore "SCHEDULER_DATA/config/private/private-https.jks" -storepass jobscheduler
Example for use of self-signed certificate with PKCS12 keystore format
Code Block language bash title Example how to generate a PKCS12 Keystore with private key and public certificate # generate Master private key with alias name "master-https" in a keystore (private-https.p12) # use the fully qualified hostname (FQDN) and name of your organization for the distinguished name # consider that PKCS12 keystores require to use the same key password and store password keytool -genkey -alias "master-https" -dname "CN=hostname,O=organization" -validity 1461 -keyalg RSA -keysize 2048 -keypass jobscheduler -keystore "SCHEDULER_DATA/config/private/private-https.pk12" -storepass jobscheduler -storetype PKCS12
- Example for use of CA signed certificate with PKCS12 keystore format
Code Block language bash title Example how to
# should your Master private key and certificate by provided with a .jks keystore (keypair.jks) then temporarily convert the keystore to pkcs12 (keystore.p12) # for later use with openssl, assuming the alias name of the Master private key is "master-https" # keytool -importkeystore -srckeystore keypair.jks -destkeystore keystore.p12 -deststoretype PKCS12 -srcalias master-https # assuming your Master private key from a pkcs12 keystore (keystore.p12), store the Master private key to a .key file in PEM format (master-https.key) openssl pkcs12 -in keystore.p12 -nocerts -out master-https.key # concatenate CA root certificate and CA intermediate certificates to a single CA Bundle certificate file (ca-bundle.crt) cat RootCACertificate.crt > ca-bundle.crt cat CACertificate.crt >> ca-bundle.crt # Export Master private key (master-https.key), Master public certificate in PEM format (master-https.crt) and CA Bundle in PEM format (ca-bundle.crt) to a new keystore (private-https.p12) # assume the fully qualified hostname (FQDN) of the Master server to be "master.example.com" openssl pkcs12 -export -in master-https.crt -inkey master-https.key -chain -CAfile ca-bundle.crt -name master.example.com -out private-https.p12 # should you require use of a .jks keystore type then convert the pkcs12 keystore assuming the alias name of the Master private key to be "master-https" # keytool -importkeystore -srckeystore private-https.p12 -srcstoretype PKCS12 -destkeystore private-https.jks -deststoretype JKS -srcalias master-https
Explanations
- Replace the
SCHEDULER_DATA
placeholder as specified above. - The
-dname
option specifies the certificate issuer, therefore use your own set of CN, O, OU, DC that specify the issuer's distinguished name. The O setting is required for the issuer. - The
-keypass
option accepts the password that you will need later on to manage your private key. With the default password being used no further settings are required as explained below. - The
-keystore
option specifies the location of your Keystore file.- The Keystore file should be in reach of the JobScheduler Master, it is therefore recommended to use a sub-folder
private
in the./config
directory. - Using the default file name
"private-https.jks"
will save the effort of adding further settings as explained above.
- The Keystore file should be in reach of the JobScheduler Master, it is therefore recommended to use a sub-folder
- The
-storepass
option specifies the password for access to your Keystore file. For the handling of the default password the same applies as stated with the-keypass
option. - The
-storetype
option is used for the PKCS12 keystore format, this option is not required for the JKS keystore format.
- Replace the
- If not otherwise configured then the JobScheduler Master by default uses the password
jobscheduler
for the respective Keystore. - If you choose an individual password for the JobScheduler Master Keystore then adjust the following properties in the
SCHEDULER_DATA/
config/private/private.conf
configuration file:- Explanations
jobscheduler.master.webserver.https.keystore.file
is used for the path to the Keystorejobscheduler.
is used for the Keystore passwordmaster
.webserver.https.keystore.passwordjobscheduler.
is used for the password of your private keymaster
.webserver.https.keystore.key-password
Example
Code Block language text title Example for private.conf file specifying the Master Keystore jobscheduler.master.webserver.https.keystore { file = "C:/ProgramData/sos-berlin.com/jobscheduler/master110/config/private/private-https.jks" # Backslashes are written twice (as in JSON notation): # file = "\\\\other-computer\\share\\my-keystore.jks" password = "jobscheduler" key-password = "jobscheduler" }
- Explanations
create a Private Key and CA-signed Certificate # Creating the Private Key and CA-signed Certificate for the given validity period ./create_server_certificate.sh --dns=joc.example.com --days=365
Refer to examples available from JS7 - How to add SSL TLS Certificates to Keystore and Truststore.
Code Block title Example how to add a Private Key and Certificate to a PKCS12 keystore # Adding the Private Key and Certificate to a keystore ./js7_create_certificate_store.sh \ --keystore=JETTY_BASE/resources/joc/https-keystore.p12 \ --key=joc.example.com.key \ --cert=joc.example.com.crt \ --alias=joc.example.com \ --password="jobscheduler"
When using additional arguments for creation of a truststore then users can skip the later step 3:Code Block title Example how to add a Private Key and Certificate to a PKCS12 keystore and the Root CA Certificate to a truststore # Adding the Private Key and Certificate to a keystore and Root CA Certificate to a truststore ./js7_create_certificate_store.sh \ --keystore=JETTY_BASE/resources/joc/https-keystore.p12 \ --truststore=JETTY_BASE/resources/joc/https-keystore.p12 \ --key=joc.example.com.key \ --cert=joc.example.com.crt \ --alias=joc.example.com \ --password="jobscheduler" \ --ca-root=root-ca.crt
Hide If endDateTime 2024-08-20T00:00:00 currentSpace JS7 Code Block language bash title Example how to generate a Private Key and CA-signed Certificate for import into a PKCS12 keystore collapse true # Generate the JOC Cockpit's Private Key with the "joc.example.com" alias name and Certificate in a keystore (https-keystore.p12) # use the fully qualified domain name (FQDN) assumed to be "joc.example.com" and name of your organization for the distinguished name # Note that PKCS12 keystores require to use the same key password and store password keytool -genkey -alias "joc.example.com" -dname "CN=joc.example.com,O=organization" -validity 1461 -keyalg RSA -keysize 2048 -keypass jobscheduler -keystore "JETTY_BASE/resources/joc/https-keystore.p12" -storepass jobscheduler -storetype PKCS12
- Generate the Java Keystore with the private key and the public certificate for the JobScheduler Master and export the certificate to a second Keystore that is later on used by the JOC Cockpit.
Step 3: Creating the JOC Cockpit Truststore
- For JOC Cockpit Server Authentication a truststore technically is not needed. However, the Jetty servlet container requires a truststore to be in place. An empty truststore should not be used, instead create a truststore with the Root CA Certificate.
- Users who create the truststore with above step 2 can skip this step.
- On the JOC Cockpit server create the truststore using the
keytool
from your Java JRE, JDK or some 3rd-party utility.- For use with a 3rd-party utility create a truststore, e.g.
https-truststore.p12,
in PKCS12 format and import:- Root CA Certificate
- The below examples suggest a possible approach for certificate management - however, there may be other ways how to achieve similar results.
Example for import of a Root CA Certificate to a PKCS12 truststore:
Code Block language bash title Example how to import a Root CA Certificate to a PKCS12 truststore # import Root CA Certificate in PEM format to a PKCS12 truststore (https-truststore.p12) keytool -importcert -alias "root-ca" -file "root-ca.crt" -keystore "JETTY_BASE/resources/joc/https-truststore.p12" -storetype PKCS12
Example for import of a Root CA Certificate to a JKS truststore:
- Example for export with JKS keystore format
Code Block language bash title Example how to
import a Root CA Certificate to a JKS
truststore collapse true # import Root CA Certificate in PEM format to a
JKS
truststore
(
https-
truststore.
jks) keytool -
importcert -
alias "root-
ca" -file "
root-
ca.crt"
-
keystore "
JETTY_
BASE/
resources/
joc/
https-
truststore.jks" -
Example for export with PKCS12 keystore format
Code Block language bash title Example how to export the Master public certificate from a PKCS12 Keystore # export Master public certificate from keystore (private-https.p12) identified by its alias name (master-https) to a file in PEM format (master-https.crt) keytool -exportcert -rfc -noprompt -file "master-https.crt" -alias "master-https" -keystore "SCHEDULER_DATA/config/private/private-https.p12" -storepass jobscheduler -storetype PKCS12
- The exported public certificate of each JobScheduler Master has to be imported to the Java Truststore that is used by the JOC Cockpit.
- For use with a 3rd-party utility create a truststore, e.g.
Step 2: Set up Authentication to JobScheduler Master
- The JobScheduler Master HTTPS web service is only accessible to authenticated users that are identified by the JobScheduler ID.
- The JobScheduler ID is specified on installation of a JobScheduler Master and is a unique string.
- Should you operate a JobScheduler cluster then the same JobScheduler ID is used that has been assigned to all Masters during setup. Do not mix up the JobScheduler ID and the suffix
-backup
that is applied to a Backup Master installation directory.
- The JobScheduler Master expects HTTP Basic Authentication.
The credentials are used from
SCHEDULER_DATA/
config/private/private.conf
configuration file that offers an entry like this:Code Block jobscheduler.master.auth.users { JOBSCHEDULER_ID = "HASH_SCHEME:HASHED_PASSWORD" }
The
HASH_SCHEME
is specified by the prefix "plain" and is followed by the password:Code Block jobscheduler.master.auth.users { jobscheduler_prod = "plain:secret" }
Step 3: Set up the JobScheduler Master for HTTPS
Specify the ports with the <
config>
element in theSCHEDULER_DATA/
config/scheduler.xml configuration
file like this:- the HTTP port is required but is limited to the localhost network interface with the
http_port
attribute the HTTPS port with the
https_port
attribute of like this:Code Block language xml <spooler> <config http_port="localhost:40444" https_port="48444" mail_xslt_stylesheet="config/scheduler_mail.xsl"> <!-- other elements --> </config> </spooler>
- the HTTP port is required but is limited to the localhost network interface with the
Step 4: Configure the JOC Cockpit Web Service Truststore
On the JOC Cockpit server perform the following steps:
storetype JKS
Anchor | ||||
---|---|---|---|---|
|
Edit the following entries in the
JETTY_BASE/start.d./ssl.ini
configuration file for use of the keystore and truststore:Code Block title Example how to use the keystore/truststore settings with the start.d/ssl.ini file ## Keystore file path (relative to $jetty.base) jetty.sslContext.keyStorePath=resources/joc/https-keystore.p12 ## Keystore password jetty.sslContext.keyStorePassword=jobscheduler ## KeyManager password (same as keystore password for pkcs12 keystore type) jetty.sslContext.keyManagerPassword=jobscheduler ## The Keystore type. jetty.sslContext.keyStoreType=PKCS12 ## Truststore file path (relative to $jetty.base) jetty.sslContext.trustStorePath=resources/joc/https-truststore.p12 ## Truststore password jetty.sslContext.trustStorePassword=jobscheduler ## TrustStore type. jetty.sslContext.trustStoreType=PKCS12
Explanation:- Specify the location of the keystore with the
keyStorePath
setting. A location relative to theJETTY_BASE
directory can be specified. - Specify the password for your keystore with the
keyStorePassword
setting. - The password specified with the
keyManagerPassword
setting is used for access to the Private Key. The same password as for thekeyStorePassword
setting has to be used for a PKCS12 keystore type. - Optionally specify the keystore type with the
keyStoreType
setting. If this setting is missing then the JVM's default keystore type will be used. - Specify the location of the truststore with the
trustStorePath
setting. A location relative to theJETTY_BASE
directory can be specified. - Specify the password for access to the truststore with the
trustStorePassword
setting. - Specify the truststore type to be one of
PKCS12
orJKS
.
- Specify the location of the keystore with the
Specify the HTTPS port with the following entries of the
JETTY_BASE/start.d/ssl.ini
configuration file (default HTTPS port is 48446):Code Block title Example how to set the port for the HTTPS protocol with the start.d/ssl.ini file ## The host/address to bind the connector to. jetty.ssl.host=joc.example.com ## Connector port to listen on jetty.ssl.port=48446
Explanation:- The
jetty.ssl.host
setting optionally can be used to limit port access to the specified host/network interface. - The
jetty.ssl.port
setting specifies the port for Jetty. Consider to allow incoming connections to this port from your firewall.
- The
Step 5: Deactivating HTTP Access
Users who intend to enforce HTTPS should deactivate HTTP access by adding a comment to the following module directive in the JETTY_BASE/start.d/http.ini
configuration file like this:
Code Block | ||
---|---|---|
| ||
# Module: http
# --module=http |
It is recommended to deactivate HTTP access to JOC Cockpit if HTTPS is enabled. Typically HTTPS is not an invite to users to fall back to a less secure HTTP protocol. Should both protocols be used then consider that separate ports or separate network interfaces using the same port are required.
The following example suggests that the host/network interfaces centostest-primary
should be used for HTTP and the host/network interface centostest-secondary
should be used for HTTPS: A single port 4446
is used.
Code Block | ||
---|---|---|
| ||
# Module: http
--module=http
## The host/address to bind the connector to.
jetty.http.host=centostest-primary
## The port the connector listens on.
jetty.http.port=4446 |
Code Block | ||
---|---|---|
| ||
### TLS (SSL) Connector Configuration
--module=ssl
## The host/address to bind the connector to.
jetty.ssl.host=centostest-secondary
## The port the connector listens on.
jetty.ssl.port=4446 |
Mutual Authentication for Clients and JOC Cockpit
This configuration is applied in order to enable mutual authentication:
- the client verifies the JOC Cockpit Server Authentication certificate,
- the JOC Cockpit verifies the client's Client Authentication certificate.
Anchor client_authentication_configure_jetty client_authentication_configure_jetty
Configuring Jetty
client_authentication_configure_jetty | |
client_authentication_configure_jetty |
See above chapter Secure Connections from Clients to JOC Cockpit for configuration of the keystore/truststore with JETTY_BASE/start.d/ssl.ini
.
Edit the following entries in the
JETTY_BASE/start.d/ssl.ini
configuration file for the truststore location:- To enable certificates as a single or as a second factor for authentication Jetty can be configured to automatically challenge clients to present a Client Authentication certificate.
Specify the settings to allow client authentication with the following entries in the
JETTY_BASE/start.d/ssl.ini
configuration file:Code Block title Example how to enforce client authentication with the start.ini file ## enable use of client authentication certificates jetty.sslContext.needClientAuth=false jetty.sslContext.wantClientAuth=true jetty.sslContext.endpointIdentificationAlgorithm=
Explanation:
- Find explanations from the JS7 - Authentication article.
Risk Mitigation
The above explanations indicate use of a Root CA Certificate for verification of Client Authentication certificates when it comes to mutual authentication.
- In fact use of a Root CA Certificate allows any clients that dispose of a Client Authentication certificate signed by the same Root CA or Intermediate CA to be authenticated. This implication might allow an unwanted number of clients to access JOC Cockpit.
- Coping strategies include
- to use a separate Certificate Authority to sign Client Authentication certificates for access to JOC Cockpit.
- to import individual Client Authentication certificates to the JOC Cockpit's truststore instead of using a Root CA Certificate.
Notes
- A restart of JOC Cockpit is required to apply modifications to the JOC Cockpit
JETTY_BASE/start.d/*.ini
configuration file and - The JOC Cockpit Keystore can also be used as a Truststore where the certificates of a number of JobScheduler Masters are imported.
Example for JKS Keystore
Code Block language bash title Example how to import the Master public certificate to JOC Cockpit JKS Keystore # import Master public certificate from a file in PEM format (master-https.crt) identified by its alias name (master-https) to the JOC Cockpit JKS keystore (joc-https.jks) keytool -importcert -noprompt -file "master-https.crt" -alias "master-https" -keystore "JETTY_BASE/etc/joc-https.jks" -storepass jobscheduler -trustcacerts
Example for PKCS12 Keystore
Code Block language bash title Example how to import the Master public certificate to JOC Cockpit PKCS12 Keystore # import Master public certificate from a file in PEM format (master-https.crt) identified by its alias name (master-https) to the JOC Cockpit PKCS12 keystore (joc-https.p12) keytool -importcert -noprompt -file "master-https.crt" -alias "master-https" -keystore "JETTY_BASE/etc/joc-https.p12" -storepass jobscheduler -storetype PKCS12 -trustcacerts
Explanations
- The alias of each certificate has to be unique for the target Keystore.
- Alternatively, you can import the JobScheduler Master certificates into the default Java Truststore (
JAVA_HOME/lib/security/cacerts
) of the Java installation which is used by Jetty, however, this setting will be lost if you switch the Java version.
If you use the Keystore of your JOC Cockpit Web Service in Jetty as the Truststore of the JobScheduler Master certificates then add the location of the Truststore to the
JETTY_BASE/resources/joc/joc.properties
configuration file like this:Example for JKS keystore format
Code Block language text ### Location of the Java truststore that contains the certificates of each ### JobScheduler Master for HTTPS connections. The path can be absolute or relative ### to joc.properties truststore_path = ../../etc/joc-https.jks truststore_password = jobscheduler
Example for PKCS12 keystore format
Code Block language text ### Location of the Java truststore that contains the certificates of each ### JobScheduler Master for HTTPS connections. The path can be absolute or relative ### to joc.properties truststore_path = ../../etc/joc-https.p12 truststore_type = PKCS12 truststore_password = jobscheduler
- Explanations
- The relative path from the above example looks up the Keystore in the
JETTY_BASE/etc
directory.
- The relative path from the above example looks up the Keystore in the
- The hostname verification can be added optionally in the
JETTY_BASE/resources/joc/joc.properties
configuration file.Code Block ################################################################################ ### Should hostname verification be carried out for https certificate. ### Default false https_with_hostname_verification = true
Caveat
- configuration files configuration file.
Resources
- JS7 - Controller HTTPS Connections
- JS7 - Agent HTTPS Connections
- JS7 - Configuration Templates
- JS7 - How to create X.509 SSL TLS Certificates
- JS7 - How to add SSL TLS Certificates to Keystore and TruststoreIn order to apply modifications to ./config/private/private.conf files of the Master or to any configuration files of JOC Cocckpit a restart of the respective component is required.