Hi Mickael,

Thanks for the KIP. It’s good to see Kafka take on the PQC world; I had a few 
comments.

AK1: nit: but the Status is still marked as Draft and the Discussion Link is 
still TBD

AK2: The reflection mechanism could use some details. Are we storing a 
MethodHandle reference when DefaultSslEngineFactory initializes in a static 
block?

AK3: If the contract is to throw ConfigException because of missing names group 
support on the jdk, there’s nothing in the SslEngineFactory to have other 
engines follow the spec. ssl.engine.factory.class for other engines won’t 
adhere to this, and may break silently after launch.

AK4: Should we file a JIRA in conjunction to deprecate/cleanup the reflection 
once all clients and servers update their minimum supported version >= 20?

AK5: 
> a TLS connection can only be established when the client and server share at 
> least one named group

I see in other replies than this would this be an sslhandshakexception that the 
jdk SSLEngine throws. Would it be worth adding a custom KafkaException that 
suggests to users on the supported named groups in the current VM via 
SSLContext.getSupportedSSLParameters().getNamedGroups(). We sometimes do this 
when serialization fails, max poll interval elapses etc.

AK6: On Testing, there’s a negative test that we’re missing. We can ensure 
assertThrows(ConfigException.class) on jdk versions < 20 which maybe a lot of 
the clients out there.

AK7: I think for the simplicity alone, reflection is what we might settle on. 
But I wanted to call out that there’s technically another approach that might 
get us there without it.
We could do a multi-release JAR which has been available since jdk9. We can 
create a custom java20 source set and have gradle include it in the build. 
We can define a plain class on the base layer as
```java
public class NamedGroupSupport {
    public boolean supported() { return false; }
    public void apply(SSLParameters sslParams, String[] groups) { throw new 
UnsupportedOperationException(); }
}
```
And in the java20 source set, have the right implementation. We also need 
```groovy
jar {
   into(‘META-INF/versions/20’) { from sourceSets.java20.output }
  manifest { attributes ‘Multi-Release’: ‘true’ }
}
```
With the above in addition to a custom java20 source set with options.release = 
20 could get us there for free. 

But the cost is the build complexity, if someone shades the kafka-clients JAR 
they lose support. Also for clients who fork and build their own JARs this 
would not be preferable. So overall, reflection is the simpler answer I think 
but an alternative nonetheless to reject imo.

Thanks,
Aditya Kousik

On 2026-10-06 10:14 UTC Mickael Maison wrote:
> Hi,
>
> I'd like to start a discussion about KIP-1376 which proposes adding
> support for TLS named groups:
> https://cwiki.apache.org/confluence/x/dJXwGg
>
> Thanks,
> Mickael
>

Reply via email to