diff --git a/common/src/main/java/io/netty5/util/internal/Hidden.java b/common/src/main/java/io/netty5/util/internal/Hidden.java index f706f287d62..0fd57de65e1 100644 --- a/common/src/main/java/io/netty5/util/internal/Hidden.java +++ b/common/src/main/java/io/netty5/util/internal/Hidden.java @@ -103,6 +103,10 @@ public void applyTo(BlockHound.Builder builder) { "io.netty5.handler.ssl.ReferenceCountedOpenSslClientContext$ExtendedTrustManagerVerifyCallback", "verify"); + builder.allowBlockingCallsInside( + "io.netty.handler.ssl.JdkSslContext$Defaults", + "init"); + // Let's whitelist SSLEngineImpl.unwrap(...) for now as it may fail otherwise for TLS 1.3. // See https://mail.openjdk.java.net/pipermail/security-dev/2020-August/022271.html builder.allowBlockingCallsInside( diff --git a/handler/src/main/java/io/netty5/handler/ssl/JdkSslContext.java b/handler/src/main/java/io/netty5/handler/ssl/JdkSslContext.java index 57be24c69a6..41b88ab7a1b 100644 --- a/handler/src/main/java/io/netty5/handler/ssl/JdkSslContext.java +++ b/handler/src/main/java/io/netty5/handler/ssl/JdkSslContext.java @@ -67,35 +67,56 @@ public class JdkSslContext extends SslContext { private static final Provider DEFAULT_PROVIDER; static { - SSLContext context; - try { - context = SSLContext.getInstance(PROTOCOL); - context.init(null, null, null); - } catch (Exception e) { - throw new Error("failed to initialize the default SSL context", e); + Defaults defaults = new Defaults(); + defaults.init(); + + DEFAULT_PROVIDER = defaults.defaultProvider; + DEFAULT_PROTOCOLS = defaults.defaultProtocols; + SUPPORTED_CIPHERS = defaults.supportedCiphers; + DEFAULT_CIPHERS = defaults.defaultCiphers; + DEFAULT_CIPHERS_NON_TLSV13 = defaults.defaultCiphersNonTLSv13; + SUPPORTED_CIPHERS_NON_TLSV13 = defaults.supportedCiphersNonTLSv13; + + if (logger.isDebugEnabled()) { + logger.debug("Default protocols (JDK): {} ", Arrays.asList(DEFAULT_PROTOCOLS)); + logger.debug("Default cipher suites (JDK): {}", DEFAULT_CIPHERS); } + } + + private static final class Defaults { + String[] defaultProtocols; + List defaultCiphers; + List defaultCiphersNonTLSv13; + Set supportedCiphers; + Set supportedCiphersNonTLSv13; + Provider defaultProvider; - DEFAULT_PROVIDER = context.getProvider(); + void init() { + SSLContext context; + try { + context = SSLContext.getInstance(PROTOCOL); + context.init(null, null, null); + } catch (Exception e) { + throw new Error("failed to initialize the default SSL context", e); + } - SSLEngine engine = context.createSSLEngine(); - DEFAULT_PROTOCOLS = defaultProtocols(context, engine); + defaultProvider = context.getProvider(); - SUPPORTED_CIPHERS = Collections.unmodifiableSet(supportedCiphers(engine)); - DEFAULT_CIPHERS = Collections.unmodifiableList(defaultCiphers(engine, SUPPORTED_CIPHERS)); + SSLEngine engine = context.createSSLEngine(); + defaultProtocols = defaultProtocols(context, engine); - List ciphersNonTLSv13 = new ArrayList<>(DEFAULT_CIPHERS); - ciphersNonTLSv13.removeAll(Arrays.asList(SslUtils.DEFAULT_TLSV13_CIPHER_SUITES)); - DEFAULT_CIPHERS_NON_TLSV13 = Collections.unmodifiableList(ciphersNonTLSv13); + supportedCiphers = Collections.unmodifiableSet(supportedCiphers(engine)); + defaultCiphers = Collections.unmodifiableList(defaultCiphers(engine, supportedCiphers)); - Set suppertedCiphersNonTLSv13 = new LinkedHashSet<>(SUPPORTED_CIPHERS); - for (String defaultTlsv13CipherSuite : SslUtils.DEFAULT_TLSV13_CIPHER_SUITES) { + List ciphersNonTLSv13 = new ArrayList<>(defaultCiphers); + ciphersNonTLSv13.removeAll(Arrays.asList(SslUtils.DEFAULT_TLSV13_CIPHER_SUITES)); + defaultCiphersNonTLSv13 = Collections.unmodifiableList(ciphersNonTLSv13); + + Set suppertedCiphersNonTLSv13 = new LinkedHashSet<>(supportedCiphers); + for (String defaultTlsv13CipherSuite : SslUtils.DEFAULT_TLSV13_CIPHER_SUITES) { suppertedCiphersNonTLSv13.remove(defaultTlsv13CipherSuite); } - SUPPORTED_CIPHERS_NON_TLSV13 = Collections.unmodifiableSet(suppertedCiphersNonTLSv13); - - if (logger.isDebugEnabled()) { - logger.debug("Default protocols (JDK): {} ", Arrays.asList(DEFAULT_PROTOCOLS)); - logger.debug("Default cipher suites (JDK): {}", DEFAULT_CIPHERS); + supportedCiphersNonTLSv13 = Collections.unmodifiableSet(suppertedCiphersNonTLSv13); } }