bc-fips-2.1.2.jar bcutil-fips-2.1.5.jar bctls-fips-2.1.22.jar bcpkix-fips-2.1.10.jar
FIPS 140-3 Compliance Support
Run Mule 4 in a Federal Information Processing Standard (FIPS) 140-3 certified environment by enabling approved cryptography providers and runtime settings. Use this guide to install BC-FJA, enable FIPS mode, and configure TLS and keystore formats for compliant deployments. These steps help you meet federal cryptography requirements while keeping runtime behavior predictable across environments.
Mule doesn’t run in FIPS security mode by default. To use FIPS security mode:
-
Install a certified cryptography module in your Java environment.
-
Adjust Mule runtime settings to run in FIPS security mode.
Compatibility
FIPS 140-3 support requires:
-
Mule 4.11.4 or later (for earlier versions of Mule runtime, use FIPS 140-2 Compliance Support)
-
Java 17 or later
-
FIPS license from the license
.zipfile provided by MuleSoft (the non-FIPS license isn’t valid for FIPS mode)
Assumptions
This document assumes you’re familiar with FIPS 140-3, the US government security standard that requires that compliant parties use only cryptographic algorithms and techniques that have been certified by NIST.
These instructions use BC-FJA, the recommended FIPS 140-3 certified security provider for Mule runtime (Certificate #4943). If you use a different certified security provider, refer to that provider’s documentation for configuration instructions.
Installing BC-FJA Security Provider
Mule runtime uses BC-FJA 2.1.2 as its FIPS 140-3 certified cryptography provider.
Installation Steps
These instructions show how to install and configure BC-FJA security provider in Java 17 or later.
-
Verify that you’re using Java 17 or later and
JAVA_HOMEis set. -
Download the BC-FJA 2.1.2 provider files from the BouncyCastle website.
-
Copy the required JAR files to the
${MULE_HOME}/lib/bootfolder: -
Configure the security providers in the
${JAVA_HOME}/conf/security/java.securityfile:security.provider.1=org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider security.provider.2=org.bouncycastle.jsse.provider.BouncyCastleJsseProvider fips:BCFIPS
-
Configure the key manager and trust manager algorithms in the same
java.securityfile:ssl.KeyManagerFactory.algorithm=PKIX ssl.TrustManagerFactory.algorithm=PKIX
Running Mule in FIPS Security Mode
After installing the BC-FJA provider, configure Mule to run in FIPS 140-3 mode:
-
Open your
wrapper.conffile (located in${MULE_HOME}/conf). -
Add these properties. Replace
<n>with the next sequential number in your file:# Enable FIPS 140-3 security mode wrapper.java.additional.<n>=-Dmule.security.model=fips140-3 # Enable Bouncy Castle approved-only mode wrapper.java.additional.<n>=-Dorg.bouncycastle.fips.approved_only=true # Required for Java 17+ module access wrapper.java.additional.<n>=--add-opens=java.base/sun.security.provider=org.bouncycastle.fips.core # Set keystore type to BCFKS wrapper.java.additional.<n>=-Dmule.keystore.type=BCFKS
-
If you’re using a clustered environment, also add the cluster encryption key:
wrapper.java.additional.<n>=-Dmule.cluster.network.encryption.key={your-encryption-key}For more information about clustering in FIPS mode, see Cluster reference.
-
Save your changes and start Mule runtime.
|
In FIPS-compliant environments, all keystores and truststores typically require BCFKS format. To support legacy JKS stores, such as the default Java truststore at |
When Mule launches, the startup logs show that FIPS 140-3 security mode is enabled. Mule automatically restricts protocol negotiations to use only approved cryptographic cipher suites.
|
Not all connectors are FIPS 140-3 compliant. Only connectors tagged as |
FIPS 140-3 Compliant Cipher Suites
These cipher suites are enabled by default when running Mule in FIPS 140-3 mode.
TLS 1.3 Cipher Suites
-
TLS_AES_128_GCM_SHA256
-
TLS_AES_256_GCM_SHA384
-
TLS_AES_128_CCM_SHA256
-
TLS_AES_128_CCM_8_SHA256
TLS 1.2 Cipher Suites
-
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
-
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
-
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
-
TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
-
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
-
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
-
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
-
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
-
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
-
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
-
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
|
These cipher suites are configured in the |
FIPS 140-3 Compliant Keystore Formats
Keystores or truststores in non-FIPS environments are typically formatted as PKCS12 or JKS. These formats aren’t FIPS-compliant. Convert them to BCFKS format.
-
Use this example command to convert a
JKSkeystore toBCFKSformat. If the source keystore isPKCS12, set-srcstoretypetoPKCS12in thekeytoolcommand:BC_FIPS_JAR=${MULE_HOME}/lib/boot/bc-fips-2.1.2.jar # Replace with a correct path OLD_KEYSTORE="keystore.jks" # Replace with the keystore to convert OLD_PASSWD="changeit" # Replace with the keystore password NEW_KEYSTORE="keystore.bcfks" # Replace with the new keystore NEW_PASSWD="changeit" # Replace with the new keystore password keytool -importkeystore \ -providerclass sun.security.provider.Sun \ -providerclass org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider \ -providerpath ${BC_FIPS_JAR} \ -srckeystore ${OLD_KEYSTORE} -srcstoretype JKS -srcstorepass ${OLD_PASSWD} \ -destkeystore ${NEW_KEYSTORE} -deststoretype BCFKS -deststorepass ${NEW_PASSWD} -
Update the TLS configuration in your Mule application to use the new keystore or truststore:
<tls:context> <tls:key-store type="bcfks" path="server.bcfks" password="changeit" keyPassword="changeit" alias="default" /> <tls:trust-store type="bcfks" path="client.bcfks" password="changeit" /> </tls:context>
-
By default, the JVM truststore at
${JAVA_HOME}/lib/security/cacertsis aJKS. There are two approaches to handle this special case:-
Convert to BCFKS
-
Convert the
JKSstore toBCFKSusing thekeytoolcommand as described in FIPS 140-3 Compliant Keystore Formats, pointing OLD_KEYSTORE to${JAVA_HOME}/lib/security/cacertsand NEW_KEYSTORE to${JAVA_HOME}/lib/security/cacerts.bcfks -
Add these properties to your
wrapper.conffile:wrapper.java.additional.<n>=-Djavax.net.ssl.trustStore=${JAVA_HOME}/lib/security/cacerts.bcfks wrapper.java.additional.<n>=-Djavax.net.ssl.trustStorePassword=changeit wrapper.java.additional.<n>=-Djavax.net.ssl.trustStoreType=bcfks
-
-
Allow legacy
JKSstore-
Add this property to your
wrapper.conffile:wrapper.java.additional.<n>=-Dorg.bouncycastle.jca.enable_jks=true
-
-
Connectors Compatibility
Only connectors tagged as fips-140-3-verified in Anypoint Exchange are certified for use in FIPS 140-3 environments. To check compliance in Exchange before deploying:
-
Open Anypoint Exchange.
-
Search for the connector.
-
Check for the
fips-140-3-verifiedtag.
Tips and Limitations
-
Not all encryption schemes and signatures are FIPS 140-3 compliant. If your application uses a non-approved algorithm, you get this runtime error:
Could not find encryption algorithm '<algorithm-name>'. You are running in FIPS mode, so please verify that the algorithm is compliant with FIPS.
-
Different environments can have different security configurations. Test before deploying to production.



