How to import a public SSL certificate into a JVM
This Knowledge Base article was written specifically for the Atlassian Server platform. Due to the Functional differences in Atlassian Cloud, the contents of this article cannot be applied to Atlassian Cloud applications.
When connecting two servers via HTTPS, the public SSL certificate from each server must be loaded on to the other server.
There are 2 ways to import a public SSL certificate into a JVM:
Download and install the Portecle app onto the server that runs your application.
This is a third-party application and not supported by Atlassian.
<JAVA_HOME>variable is pointing to the same version of Java that your application uses. See our Setting JAVA_HOME docs for further information on this.
If running on a Linux/UNIX server, X11 will need to be forwarded when connecting to the server (so you can use the GUI), as below:
ssh -X user@server
- Select the Examine menu and then click Examine SSL/TLS Connection:
- Enter the SSL Host and Port of the target system:
- Wait for it to load, then select the public certificate and click on PEM:
- Export the certificate and save it.
- Go back to the main screen and select the Open an existing keystore from disk option, select
$JAVA_HOME/lib/security/cacerts) then enter the password (the default is
- Select the Import a trusted certificate into the loaded keystore button:
- Select the certificate that was saved in step 6 and confirm that you trust it, giving it an appropriate alias (e.g.: confluence).
- You may hit this error:
- If so, hit OK, and then accept the certificate as trusted.
- You may hit this error:
- Save the Key Store to disk:
- Restart your application.
- Test that you can connect to the host.
Command Line Installation
Fetch the certificate, replacing google.com with the FQDN of the server JIRA is attempting to connect to:
openssl s_client -connect google.com:443 < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > public.crt
openssl s_client -connect google.com:443 < NUL | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > public.crt
The command above will only be executed if you have Sed for Windows as well as OpenSSL installed on your environment. If you don't have Sed or OpenSSL or you don't want to install it, use the instructions below as an alternative. Issue the following command:
openssl s_client -connect google.com:443
Save the output to a file called
public.cert.Edit the the
public.certfile so it contains only what is between the
END CERTIFICATElines. This is how your file should look like after you edited it:
-----BEGIN CERTIFICATE----- < Certificate content as fetched by the command line. Don't change this content, only remove what is before and after the BEGIN CERTIFICATE and END CERTIFICATE. That's what your Sed command is doing for you :-) > -----END CERTIFICATE-----
Import the certificate:
<JAVA_HOME>/bin/keytool -import -alias <server_name> -keystore <JAVA_HOME>/jre/lib/security/cacerts -file public.crt
Then enter the password if prompted (the default is
Alternative KeyStore Locations
Java will normally use a system-wide keystorein
$JAVA_HOME/jre/lib/security/cacerts, but it is possible to use a different keystore by specifying a parameter, -Djavax.net.ssl.trustStore=/path/to/keystore, where '/path/to/keystore' is the absolute file path of the alternative keystore. Information on how to configure JIRA startup variables can be found here.
However, setting this is not recommended because if Java is told to use a custom keystore (eg. containing a self-signed certificate), then Java will not have access to the root certificates of signing authorities found in
$JAVA_HOME/jre/lib/security/cacerts, and accessing most CA-signed SSL sites will fail. It is better to add new certificates (eg. self-signed) to the system-widekeystore (as above).
Problems are typically one of two forms:
- The certificate was installed into the incorrectkeystore.
- Thekeystoredoes not contain the certificate of the SSL service you're connecting to.