update AdvancedTlsX509KeyManager to support key alias for reloaded cert#12686
update AdvancedTlsX509KeyManager to support key alias for reloaded cert#12686zhangweikop wants to merge 1 commit intogrpc:masterfrom
Conversation
a54cf0b to
a18d1a6
Compare
a18d1a6 to
9456de4
Compare
|
I don't think using AdvancedTlsX509KeyManager with OpenSslCachingKeyMaterialProvider is all that good an approach with this, because it essentially leaks all prior keys in memory. If the life of the process after a year has 5 versions, that's not that big of a deal. But if it changes ever hour, that's not good. I don't think we're going to put random detection code in AdvancedTlsX509KeyManager to just warn you that things have gone wrong either. |
Yes, I think it should be used with caution. As for AdvancedTlsX509KeyManager itself, I think we still need to handle alias changes? |
Overview
Make the alias in
AdvancedTlsX509KeyManagerdynamic so it can be used with Netty'sOpenSslCachingX509KeyManagerFactoryto update key material after reload.Fixes #12670
Problem
When using
SslProvider.OPENSSL, each TLS handshake must encode Java key material into a nativebuffer consumed by OpenSSL, which can account for ~8% of server CPU. Netty's
OpenSslCachingX509KeyManagerFactoryavoids this by caching the encoded buffer keyed by alias —but the previous implementation always returned
"default", so the factory could never detectcredential rotations and create a new cache entry on cert reload.
Details
key-<N>(e.g.key-1,key-2, ...) and incremented on everyupdateIdentityCredentialscall, ensuring the same alias always maps to the same key material.AdvancedTlsX509KeyManager(int revisionWarningThreshold)allows customizingthe soft warning threshold (default: 1024, matching
OpenSslCachingX509KeyManagerFactory'sdefault
maxCachedEntries). A warning is logged when the counter reaches the threshold, sincebeyond that point new aliases won't be cached and per-handshake encoding overhead resumes. The
key manager remains fully functional past this threshold.
nullbefore any credentials are loaded.