Debugging SWIFT Alliance mTLS Certificate Failures
SWIFT connectivity depends on precisely configured PKI. A single missing intermediate certificate or misconfigured trust store breaks the entire connection. This guide covers the most common certificate failures in SWIFT Alliance Access, Alliance Gateway, and API-based SWIFT integrations.
SWIFT PKI overview
SWIFT uses its own Public Key Infrastructure — the SWIFT Certificate Authority (CA). All certificates used for SWIFT connectivity must be issued by or trusted through the SWIFT CA hierarchy, not by public CAs like Let's Encrypt or DigiCert.
The SWIFT CA chain typically looks like this:
SWIFT Root CA
└── SWIFT Issuing CA
└── Your institution's certificate (leaf)
For mTLS (mutual TLS), both sides authenticate — your application presents a client certificate to SWIFT, and SWIFT presents a server certificate your application must trust. Both certificate chains must be complete and correctly configured.
Common SWIFT certificate errors
Fix: Import the SWIFT CA certificates into your application's trust store (see below).
Fix: Verify the client certificate was issued by the SWIFT CA, check expiry, and confirm the private key alias matches your application config.
Fix: Check system time synchronisation (NTP) and verify the certificate's Valid From date.
Fix: Confirm which environment you're connecting to and use the matching certificate.
Setting up the SWIFT trust store
Your application needs to trust the SWIFT CA chain. Download the SWIFT CA certificates from the SWIFT Customer Security Programme (CSP) portal or your SWIFT relationship manager, then import them:
# Import SWIFT Root CA keytool -importcert \ -alias swift-root-ca \ -file swift-root-ca.pem \ -keystore your-truststore.jks \ -storepass changeit \ -noprompt # Import SWIFT Issuing CA keytool -importcert \ -alias swift-issuing-ca \ -file swift-issuing-ca.pem \ -keystore your-truststore.jks \ -storepass changeit \ -noprompt
Verify both CA certificates are present:
keytool -list -keystore your-truststore.jks -storepass changeit | grep swift
Point your application to the trust store at startup:
java -Djavax.net.ssl.trustStore=/path/to/truststore.jks \
-Djavax.net.ssl.trustStorePassword=changeit \
-jar your-application.jar
Client certificate configuration
Your application also needs to present its own certificate to SWIFT during the mTLS handshake. This certificate must be in your keystore alongside its private key:
# Import your SWIFT client certificate (after receiving from SWIFT CA) keytool -importcert \ -alias swift-client-cert \ -file your-swift-cert.pem \ -keystore your-keystore.jks \ -storepass changeit
Configure the keystore for mutual TLS:
java -Djavax.net.ssl.keyStore=/path/to/keystore.jks \
-Djavax.net.ssl.keyStorePassword=changeit \
-Djavax.net.ssl.trustStore=/path/to/truststore.jks \
-Djavax.net.ssl.trustStorePassword=changeit \
-jar your-application.jar
For Spring Boot, add to application.properties:
server.ssl.key-store=classpath:keystore.jks server.ssl.key-store-password=changeit server.ssl.key-store-type=JKS server.ssl.trust-store=classpath:truststore.jks server.ssl.trust-store-password=changeit server.ssl.client-auth=need
Diagnosing the chain
Enable Java SSL debug logging to see exactly what's happening during the handshake:
java -Djavax.net.debug=ssl:handshake -jar your-application.jar 2>&1 | grep -E "certificate|chain|verify"
Test the SWIFT endpoint directly with OpenSSL to check what certificate chain it presents:
openssl s_client \ -connect swift-gateway.yourinstitution.com:443 \ -cert your-swift-cert.pem \ -key your-swift-key.pem \ -CAfile swift-ca-bundle.pem \ -showcerts
Pre-go-live checklist
keytool -list -v and verify the alias contains both the cert and the private key entry.