FusionReactor Observability & APM

Troubleshoot

Blog / Info

Customers

About Us

Installation

Configure

Troubleshoot

Blog / Info

Customers

About Us

Retrofitting your existing Java JVM for TLS 1.2 + Let’s Encrypt

On 30 September 2025 @ 23:59 UTC we will

  1. Disable TLS 1.0 / 1.1 on every public FusionReactor endpoint (licence, downloads, Cloud ingestion).
  2. Replace our Sectigo certificate chain with Let’s Encrypt ISRG Root X1/X2.

If your server already supports TLS 1.2+ and trusts Let’s Encrypt, you’re all set.
However, if you’re stuck with Java 6, Java 7, or early Java 8 (< u101) and can’t switch JVMs, read on – Mitigation #2 allows you to stay on the old runtime while still passing modern TLS handshakes.

Why bother upgrading the old JVM’s TLS?

  • Security: TLS 1.0/1.1 are vulnerable to BEAST, POODLE and downgrade attacks.
  • Compliance: PCI-DSS, NIST 800-52r2 and most cloud vendors already require TLS 1.2+.

Future-proofing: Microsoft (Windows 11) and Apple (macOS/iOS) are removing TLS 1.0/1.1 entirely; browsers plan even shorter certificate lifetimes, which Let’s Encrypt’s 90-day model already accommodates.

Verify if your JVM is already compatible

  1. Locate the exact JVM your server uses

  • Adobe ColdFusion 
    •   Open  cfusion/bin/jvm.config  
    •   Copy the full path after  java.home=
  • Lucee Server 
    •   Open  lucee/bin/setenv.sh   (Linux) or  setenv.bat  (Windows)  
    •   Look for  LUCEE_JAVA_HOME=  or  JAVA_HOME=
  • Standalone Tomcat
    •   Open  bin/setenv.sh  (or  setenv.bat)  
    •   Copy the path assigned to  JAVA_HOME  or  JRE_HOME
  • Any other Java stack 
    •   On Linux/Unix:  `ps -ef | grep java | head -1`  → note the …/bin/java path  
    •   On Windows:  `where java`  (Command Prompt) or  `Get-Command java`  (PowerShell)

 2.  Download the 6 kB probe

{some s3 url}

3.  Run the probe with that JVM

  • <path-from-step 1>/bin/java  -jar  tls-probe.jar

The probe connects to  https://valid-isrgrootx1.letsencrypt.org/and prints the protocol it negotiated.

 

4.  Interpret the result

✓  TLSv1.2  or  TLSv1.3   →  Your JVM is ready. No action needed.  

✗  handshake_failure / TLSv1 / TLSv1.1   →  Enable TLS 1.2  

✗  PKIX path building failed  →  Import ISRG Root X1/X2 into cacerts

Step-by-Step: Upgrading an Existing JVM to TLS 1.2 + Let’s Encrypt

The commands below assume Linux. For Windows, swap forward slashes for back-slashes and run keytool from %JAVA_HOME%\bin\. Root password for the default Java keystore is almost always changeit.

1. Fetch the Let’s Encrypt root certificates

Download the two PEM files to the host (or copy via scp):

bash

CopyEdit

wget https://letsencrypt.org/certs/isrgrootx1.pem
wget https://letsencrypt.org/certs/isrgrootx2.pem      # future-proof

2. Import the roots into cacerts

bash

CopyEdit

sudo keytool -import -alias isrgrootx1 \
-keystore $JAVA_HOME/jre/lib/security/cacerts \
-file isrgrootx1.pem -storepass changeit -noprompt
sudo keytool -import -alias isrgrootx2 \
-keystore $JAVA_HOME/jre/lib/security/cacerts \
-file isrgrootx2.pem -storepass changeit -noprompt

Read-only images? Copy cacerts elsewhere, edit it, then start your JVM with

ini

CopyEdit

-Djavax.net.ssl.trustStore=/opt/custom/cacerts
-Djavax.net.ssl.trustStorePassword=changeit

3. Force TLS 1.2 on Java 7 / early 8

Open $JAVA_HOME/jre/lib/security/java.security and append:

ini

CopyEdit

jdk.tls.client.protocols=TLSv1.2

Alternatively set an environment variable (handy for containers):

bash

CopyEdit

export JAVA_TOOL_OPTIONS="-Djdk.tls.client.protocols=TLSv1.2"

4. Special case: Java 6 (no native TLS 1.2)

  1. Grab BouncyCastle JSSE (bcprov & bctls jars, version 1.78+).
  2. Drop them into $JAVA_HOME/lib/ext/.
  3. Add this line near the top of java.security (after sun.security.provider.Sun):

ini

CopyEdit

security.provider.1=org.bouncycastle.jsse.provider.BouncyCastleJsse

BouncyCastle provides a clean TLS 1.2 stack without changing your app code.

5.  Rerun the verify step above to test

Common Pitfalls & Fixes Table

Common Pitfalls & Fixes

Symptom Likely Cause Fix
PKIX path building failed Root not in cacerts or wrong trustStore used Re-import roots, ensure JVM points to correct trustStore
handshake_failure TLS 1.2 disabled Confirm jdk.tls.client.protocols=TLSv1.2 picked up (check -D flags)
JVM in Docker still fails Image rebuild overwrote cacerts Re-apply steps in the Dockerfile or mount custom trustStore

How long will this take?

  • Root import: ~30 seconds
  • TLS 1.2 flag: ~1 minute
  • BouncyCastle drop-in: ~3 minutes
  • Container rebuild / host restart: depends on environment

What if retrofitting still isn’t possible?

Use Manual / Offline Activation:

  1. In FusionReactor UI click Manual Activation on About ▸ Licence.
  2. On any machine with internet access https://fusion-reactor.com/manual, paste the code, click Activate, copy the response.
  3. Paste the response back into your server’s UI and click Activate.

No outbound TLS required afterward.

Perform this step once per host, and you can keep your legacy JVM humming long after September 30, 2025, without missing license renewals or Cloud ingestion.

Need help? support@fusion-reactor.com or live chat on our website.