When integrating certificates into Spring Boot, especially for mTLS, HTTPS, or secure inter-service communication, there are several important certificate handling considerations you should account for:
1. Keystore / Truststore Formats
| Store | Purpose | Common Format |
|---|---|---|
| Keystore | Holds your application’s private key + cert | JKS, PKCS12 (.p12 / .pfx) |
| Truststore | Holds trusted CA certs to verify clients or servers | JKS, PKCS12 |
JKS is Java-native, but PKCS12 is preferred for modern apps (more portable + supports OpenSSL).
Example Spring Boot Config:
server.ssl.key-store=classpath:server.p12
server.ssl.key-store-password=changeit
server.ssl.key-store-type=PKCS12
server.ssl.trust-store=classpath:truststore.p12
server.ssl.trust-store-password=changeit
server.ssl.trust-store-type=PKCS12
2. Certificate Chain Requirements
Spring Boot expects:
- Full certificate chain in the keystore if issued by an intermediate CA
- Trusted root CA in the truststore (for mTLS)
🔸 Failure to include the full chain often results in handshake errors or “unable to find valid certification path” errors.
3. Protocol Configuration (TLS)
Spring Boot (via embedded Tomcat) uses TLS 1.2+ by default.
To restrict or specify:
server.ssl.enabled-protocols=TLSv1.2,TLSv1.3
Disable TLS 1.0/1.1 — they are deprecated and insecure.
4. Cipher Suites
Spring Boot (via Tomcat) negotiates secure ciphers by default.
You can explicitly define them:
server.ssl.ciphers=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,...
Use modern ciphers like
ECDHE+AES_GCM.
AvoidRC4,3DES,NULL, orEXPORTciphers.
5. Mutual TLS (mTLS)
To require client certs:
server.ssl.client-auth=need
Modes:
none: default (no client cert)want: optional client certneed: mandatory client cert (for mTLS)
6. Generating Keystore & Truststore
Convert PEM to PKCS12:
openssl pkcs12 -export \
-in client.crt \
-inkey client.key \
-certfile ca.crt \
-out client-keystore.p12 \
-name client
Then import trusted CA into truststore (if using JKS):
keytool -import -alias myca -file ca.crt -keystore truststore.jks
7. Spring Boot with Reverse Proxies (e.g., Kong, F5)
If TLS termination is done by Kong/F5 and Spring Boot sits behind it:
- Use X-Forwarded headers:
server.forward-headers-strategy=framework - Do not terminate TLS inside Spring unless you need end-to-end TLS.
Summary: What to Account For
| Area | Key Considerations |
|---|---|
| Format | Use PKCS12 for best compatibility |
| Trust | Truststore must contain root CA or intermediate |
| Chain | Include full cert chain in keystore |
| Protocol | Enable TLSv1.2+ only |
| Ciphers | Use strong, modern suites |
| mTLS | Set client-auth=need + configure truststore |
| Proxy | Handle X-Forwarded-* if behind Kong/F5 |