Skip to content

Conversation

@bneradt
Copy link
Contributor

@bneradt bneradt commented Oct 30, 2025

Building on PR #11844 which added TLS group metrics, this change uses SSL_CTX_get0_implemented_groups() to dynamically discover all supported TLS groups at initialization, including KEMs (Key Encapsulation Mechanisms) like X25519MLKEM768 and SecP256r1MLKEM768 that don't have standard NIDs defined in older OpenSSL versions. This fixes issue #12622 where KEM groups were being reported as OTHER instead of their actual group names. The implementation adds a new conditional compilation path that uses string-based group maps (similar to BoringSSL) when SSL_CTX_get0_implemented_groups is available, falling back to the NID-based approach for older OpenSSL 3.x versions.

Fixes: #12622


Here's example metrics from one of our proxies, with the stats obfuscated:

[bneradt@e5 ~]$ traffic_ctl metric match ssl.group.user_agent | sed 's:[0-9]\+$:123:g'                                                                         
proxy.process.ssl.group.user_agent.sect163k1 123
proxy.process.ssl.group.user_agent.sect163k1.handshake_time 123
proxy.process.ssl.group.user_agent.K-163 123    
proxy.process.ssl.group.user_agent.K-163.handshake_time 123    
proxy.process.ssl.group.user_agent.sect163r1 123
proxy.process.ssl.group.user_agent.sect163r1.handshake_time 123
proxy.process.ssl.group.user_agent.sect163r2 123      
proxy.process.ssl.group.user_agent.sect163r2.handshake_time 123      
proxy.process.ssl.group.user_agent.B-163 123          
proxy.process.ssl.group.user_agent.B-163.handshake_time 123          
proxy.process.ssl.group.user_agent.sect193r1 123      
proxy.process.ssl.group.user_agent.sect193r1.handshake_time 123      
proxy.process.ssl.group.user_agent.sect193r2 123
proxy.process.ssl.group.user_agent.sect193r2.handshake_time 123
proxy.process.ssl.group.user_agent.sect233k1 123
proxy.process.ssl.group.user_agent.sect233k1.handshake_time 123
proxy.process.ssl.group.user_agent.K-233 123               
proxy.process.ssl.group.user_agent.K-233.handshake_time 123               
proxy.process.ssl.group.user_agent.sect233r1 123           
proxy.process.ssl.group.user_agent.sect233r1.handshake_time 123           
proxy.process.ssl.group.user_agent.B-233 123               
proxy.process.ssl.group.user_agent.B-233.handshake_time 123               
proxy.process.ssl.group.user_agent.sect239k1 123
proxy.process.ssl.group.user_agent.sect239k1.handshake_time 123
proxy.process.ssl.group.user_agent.sect283k1 123
proxy.process.ssl.group.user_agent.sect283k1.handshake_time 123
proxy.process.ssl.group.user_agent.K-283 123    
proxy.process.ssl.group.user_agent.K-283.handshake_time 123    
proxy.process.ssl.group.user_agent.sect283r1 123
proxy.process.ssl.group.user_agent.sect283r1.handshake_time 123
proxy.process.ssl.group.user_agent.B-283 123    
proxy.process.ssl.group.user_agent.B-283.handshake_time 123    
proxy.process.ssl.group.user_agent.sect409k1 123
proxy.process.ssl.group.user_agent.sect409k1.handshake_time 123
proxy.process.ssl.group.user_agent.K-409 123   
proxy.process.ssl.group.user_agent.K-409.handshake_time 123   
proxy.process.ssl.group.user_agent.sect409r1 123
proxy.process.ssl.group.user_agent.sect409r1.handshake_time 123
proxy.process.ssl.group.user_agent.B-409 123            
proxy.process.ssl.group.user_agent.B-409.handshake_time 123            
proxy.process.ssl.group.user_agent.sect571k1 123     
proxy.process.ssl.group.user_agent.sect571k1.handshake_time 123     
proxy.process.ssl.group.user_agent.K-571 123             
proxy.process.ssl.group.user_agent.K-571.handshake_time 123             
proxy.process.ssl.group.user_agent.sect571r1 123
proxy.process.ssl.group.user_agent.sect571r1.handshake_time 123
proxy.process.ssl.group.user_agent.B-571 123
proxy.process.ssl.group.user_agent.B-571.handshake_time 123
proxy.process.ssl.group.user_agent.secp160k1 123
proxy.process.ssl.group.user_agent.secp160k1.handshake_time 123
proxy.process.ssl.group.user_agent.secp160r1 123
proxy.process.ssl.group.user_agent.secp160r1.handshake_time 123
proxy.process.ssl.group.user_agent.secp160r2 123
proxy.process.ssl.group.user_agent.secp160r2.handshake_time 123
proxy.process.ssl.group.user_agent.secp192k1 123
proxy.process.ssl.group.user_agent.secp192k1.handshake_time 123
proxy.process.ssl.group.user_agent.secp192r1 123
proxy.process.ssl.group.user_agent.secp192r1.handshake_time 123
proxy.process.ssl.group.user_agent.P-192 123
proxy.process.ssl.group.user_agent.P-192.handshake_time 123
proxy.process.ssl.group.user_agent.secp224k1 123
proxy.process.ssl.group.user_agent.secp224k1.handshake_time 123
proxy.process.ssl.group.user_agent.secp224r1 123
proxy.process.ssl.group.user_agent.secp224r1.handshake_time 123
proxy.process.ssl.group.user_agent.P-224 123
proxy.process.ssl.group.user_agent.P-224.handshake_time 123
proxy.process.ssl.group.user_agent.secp256k1 123
proxy.process.ssl.group.user_agent.secp256k1.handshake_time 123
proxy.process.ssl.group.user_agent.secp256r1 123
proxy.process.ssl.group.user_agent.secp256r1.handshake_time 123
proxy.process.ssl.group.user_agent.P-256 123
proxy.process.ssl.group.user_agent.P-256.handshake_time 123
proxy.process.ssl.group.user_agent.secp384r1 123
proxy.process.ssl.group.user_agent.secp384r1.handshake_time 123
proxy.process.ssl.group.user_agent.P-384 123
proxy.process.ssl.group.user_agent.P-384.handshake_time 123
proxy.process.ssl.group.user_agent.secp521r1 123
proxy.process.ssl.group.user_agent.secp521r1.handshake_time 123
proxy.process.ssl.group.user_agent.P-521 123
proxy.process.ssl.group.user_agent.P-521.handshake_time 123
proxy.process.ssl.group.user_agent.brainpoolP256r1 123
proxy.process.ssl.group.user_agent.brainpoolP256r1.handshake_time 123
proxy.process.ssl.group.user_agent.brainpoolP384r1 123
proxy.process.ssl.group.user_agent.brainpoolP384r1.handshake_time 123
proxy.process.ssl.group.user_agent.brainpoolP512r1 123
proxy.process.ssl.group.user_agent.brainpoolP512r1.handshake_time 123
proxy.process.ssl.group.user_agent.x25519 123
proxy.process.ssl.group.user_agent.x25519.handshake_time 123
proxy.process.ssl.group.user_agent.x448 123
proxy.process.ssl.group.user_agent.x448.handshake_time 123
proxy.process.ssl.group.user_agent.brainpoolP256r1tls13 123
proxy.process.ssl.group.user_agent.brainpoolP256r1tls13.handshake_time 123
proxy.process.ssl.group.user_agent.brainpoolP384r1tls13 123
proxy.process.ssl.group.user_agent.brainpoolP384r1tls13.handshake_time 123
proxy.process.ssl.group.user_agent.brainpoolP512r1tls13 123
proxy.process.ssl.group.user_agent.brainpoolP512r1tls13.handshake_time 123
proxy.process.ssl.group.user_agent.ffdhe2048 123
proxy.process.ssl.group.user_agent.ffdhe2048.handshake_time 123
proxy.process.ssl.group.user_agent.ffdhe3072 123
proxy.process.ssl.group.user_agent.ffdhe3072.handshake_time 123
proxy.process.ssl.group.user_agent.ffdhe4096 123
proxy.process.ssl.group.user_agent.ffdhe4096.handshake_time 123
proxy.process.ssl.group.user_agent.ffdhe6144 123
proxy.process.ssl.group.user_agent.ffdhe6144.handshake_time 123
proxy.process.ssl.group.user_agent.ffdhe8192 123
proxy.process.ssl.group.user_agent.ffdhe8192.handshake_time 123
proxy.process.ssl.group.user_agent.MLKEM512 123
proxy.process.ssl.group.user_agent.MLKEM512.handshake_time 123
proxy.process.ssl.group.user_agent.MLKEM768 123
proxy.process.ssl.group.user_agent.MLKEM768.handshake_time 123
proxy.process.ssl.group.user_agent.MLKEM1024 123
proxy.process.ssl.group.user_agent.MLKEM1024.handshake_time 123
proxy.process.ssl.group.user_agent.SecP256r1MLKEM768 123
proxy.process.ssl.group.user_agent.SecP256r1MLKEM768.handshake_time 123
proxy.process.ssl.group.user_agent.X25519MLKEM768 123
proxy.process.ssl.group.user_agent.X25519MLKEM768.handshake_time 123
proxy.process.ssl.group.user_agent.SecP384r1MLKEM1024 123
proxy.process.ssl.group.user_agent.SecP384r1MLKEM1024.handshake_time 123
proxy.process.ssl.group.user_agent.OTHER 123
proxy.process.ssl.group.user_agent.OTHER.handshake_time 123

The OTHER stats are 0, as expected:

[bneradt@e5 ~]$ traffic_ctl metric match proxy.process.ssl.group.user_agent.OTHER
proxy.process.ssl.group.user_agent.OTHER 0
proxy.process.ssl.group.user_agent.OTHER.handshake_time 0

@bneradt bneradt added this to the 10.2.0 milestone Oct 30, 2025
@bneradt bneradt requested a review from moonchen October 30, 2025 20:30
@bneradt bneradt self-assigned this Oct 30, 2025
@bneradt bneradt requested review from masaori335 and removed request for moonchen October 30, 2025 20:30
@bneradt bneradt marked this pull request as draft October 30, 2025 22:11
@bneradt bneradt force-pushed the fix_kem_metrics branch 2 times, most recently from 08523c8 to 423ce64 Compare October 31, 2025 23:15
@bneradt bneradt marked this pull request as ready for review October 31, 2025 23:16
@bneradt bneradt force-pushed the fix_kem_metrics branch 3 times, most recently from 012090f to 95d674c Compare November 1, 2025 00:46
Building on PR apache#11844 which added TLS group metrics, this change uses
SSL_CTX_get0_implemented_groups() to dynamically discover all supported
TLS groups at initialization, including KEMs (Key Encapsulation
Mechanisms) like X25519MLKEM768 and SecP256r1MLKEM768 that don't have
standard NIDs defined in older OpenSSL versions. This fixes issue apache#12622
where KEM groups were being reported as OTHER instead of their actual
group names. The implementation adds a new conditional compilation path
that uses string-based group maps (similar to BoringSSL) when
SSL_CTX_get0_implemented_groups is available, falling back to the
NID-based approach for older OpenSSL 3.x versions.

Fixes: apache#12622
masaori335
masaori335 previously approved these changes Nov 4, 2025
Copy link
Contributor

@masaori335 masaori335 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Look good. Thank you!

@bneradt bneradt merged commit 3b6c894 into apache:master Nov 4, 2025
15 checks passed
@bneradt bneradt deleted the fix_kem_metrics branch November 4, 2025 21:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Missing TLS negotiated group for client with KEMs

3 participants