This is an automated email from the ASF dual-hosted git repository.
mimaison pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/kafka.git
The following commit(s) were added to refs/heads/trunk by this push:
new afed4b8183d KAFKA-20440: Use default Keystore type instead of
hardcoding PKCS12 keystore type (#22041)
afed4b8183d is described below
commit afed4b8183d954e4b76d6566c2dbab29f84f3d5b
Author: Jakub Scholz <[email protected]>
AuthorDate: Thu May 14 18:04:06 2026 +0200
KAFKA-20440: Use default Keystore type instead of hardcoding PKCS12
keystore type (#22041)
It removes the hardcoded PKCS12 in-memory keystore type that is used when
users use PEM certificates with Kafka brokers or clients. And it
replaces it with the default Keystore type based on the Java Virtual
Machine configuration. That should make the PEM support more flexible
and make it work even when running Kafka clients or servers in
environments with disabled PKCS12 support (such as the Chainguard
FIPS-compliant Java images that are based on Bouncy Castle and do not
support PKCS12 stores).
Reviewers: Manikumar Reddy <[email protected]>, Mickael Maison
<[email protected]>
---------
Signed-off-by: Jakub Scholz <[email protected]>
---
.../apache/kafka/common/security/ssl/DefaultSslEngineFactory.java | 4 ++--
.../kafka/common/security/ssl/DefaultSslEngineFactoryTest.java | 6 ++++++
docs/getting-started/upgrade.md | 1 +
3 files changed, 9 insertions(+), 2 deletions(-)
diff --git
a/clients/src/main/java/org/apache/kafka/common/security/ssl/DefaultSslEngineFactory.java
b/clients/src/main/java/org/apache/kafka/common/security/ssl/DefaultSslEngineFactory.java
index 38bbe170e8b..5c796c31de8 100644
---
a/clients/src/main/java/org/apache/kafka/common/security/ssl/DefaultSslEngineFactory.java
+++
b/clients/src/main/java/org/apache/kafka/common/security/ssl/DefaultSslEngineFactory.java
@@ -460,7 +460,7 @@ public class DefaultSslEngineFactory implements
SslEngineFactory {
private KeyStore createKeyStoreFromPem(String privateKeyPem, String
certChainPem, char[] keyPassword) {
try {
- KeyStore ks = KeyStore.getInstance("PKCS12");
+ KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(null, null);
Key key = privateKey(privateKeyPem, keyPassword);
Certificate[] certChain = certs(certChainPem);
@@ -473,7 +473,7 @@ public class DefaultSslEngineFactory implements
SslEngineFactory {
private KeyStore createTrustStoreFromPem(String trustedCertsPem) {
try {
- KeyStore ts = KeyStore.getInstance("PKCS12");
+ KeyStore ts = KeyStore.getInstance(KeyStore.getDefaultType());
ts.load(null, null);
Certificate[] certs = certs(trustedCertsPem);
for (int i = 0; i < certs.length; i++) {
diff --git
a/clients/src/test/java/org/apache/kafka/common/security/ssl/DefaultSslEngineFactoryTest.java
b/clients/src/test/java/org/apache/kafka/common/security/ssl/DefaultSslEngineFactoryTest.java
index ed76495fa03..460f03aa1b7 100644
---
a/clients/src/test/java/org/apache/kafka/common/security/ssl/DefaultSslEngineFactoryTest.java
+++
b/clients/src/test/java/org/apache/kafka/common/security/ssl/DefaultSslEngineFactoryTest.java
@@ -221,6 +221,7 @@ public class DefaultSslEngineFactoryTest {
assertEquals(List.of("kafka0"), aliases);
assertNotNull(trustStore.getCertificate("kafka0"), "Certificate not
loaded");
assertNull(trustStore.getKey("kafka0", null), "Unexpected private
key");
+ assertEquals(KeyStore.getDefaultType(), trustStore.getType());
}
@Test
@@ -236,6 +237,7 @@ public class DefaultSslEngineFactoryTest {
assertNull(trustStore.getKey("kafka0", null), "Unexpected private
key");
assertNotNull(trustStore.getCertificate("kafka1"), "Certificate not
loaded");
assertNull(trustStore.getKey("kafka1", null), "Unexpected private
key");
+ assertEquals(KeyStore.getDefaultType(), trustStore.getType());
}
@Test
@@ -276,6 +278,7 @@ public class DefaultSslEngineFactoryTest {
assertNotNull(keyStore.getCertificate("kafka"), "Certificate not
loaded");
assertNotNull(keyStore.getKey("kafka", keyPassword == null ? null :
keyPassword.value().toCharArray()),
"Private key not loaded");
+ assertEquals(KeyStore.getDefaultType(), keyStore.getType());
}
@Test
@@ -289,6 +292,7 @@ public class DefaultSslEngineFactoryTest {
assertEquals(List.of("kafka0"), aliases);
assertNotNull(trustStore.getCertificate("kafka0"), "Certificate not
found");
assertNull(trustStore.getKey("kafka0", null), "Unexpected private
key");
+ assertEquals(KeyStore.getDefaultType(), trustStore.getType());
}
@Test
@@ -304,6 +308,7 @@ public class DefaultSslEngineFactoryTest {
assertEquals(List.of("kafka"), aliases);
assertNotNull(keyStore.getCertificate("kafka"), "Certificate not
loaded");
assertNotNull(keyStore.getKey("kafka", null), "Private key not
loaded");
+ assertEquals(KeyStore.getDefaultType(), keyStore.getType());
}
@Test
@@ -319,6 +324,7 @@ public class DefaultSslEngineFactoryTest {
assertEquals(List.of("kafka"), aliases);
assertNotNull(keyStore.getCertificate("kafka"), "Certificate not
found");
assertNotNull(keyStore.getKey("kafka",
KEY_PASSWORD.value().toCharArray()), "Private key not found");
+ assertEquals(KeyStore.getDefaultType(), keyStore.getType());
}
private String pemFilePath(String pem) throws Exception {
diff --git a/docs/getting-started/upgrade.md b/docs/getting-started/upgrade.md
index bcfe9e76700..7c676ffe7fa 100644
--- a/docs/getting-started/upgrade.md
+++ b/docs/getting-started/upgrade.md
@@ -33,6 +33,7 @@ type: docs
### Notable changes in 4.4.0
* The `ClientQuotaCallback#updateClusterMetadata` method is deprecated and
will be removed in Kafka 5.0. Custom implementations of `ClientQuotaCallback`
no longer need to override this method, as a default no-op implementation is
now provided. For further details, please refer to
[KIP-1200](https://cwiki.apache.org/confluence/x/axBJFg).
+ * The in-memory keystores (used for PEM certificates) now use the default
type provided by `KeyStore.getDefaultType()` instead of the hardcoded PKCS12
type.
## Upgrading to 4.3.0