|
8 | 8 |
|
9 | 9 | package org.opensearch.http.reactor.netty4;
|
10 | 10 |
|
| 11 | +import org.opensearch.OpenSearchException; |
11 | 12 | import org.opensearch.common.Nullable;
|
12 | 13 | import org.opensearch.common.network.NetworkService;
|
13 | 14 | import org.opensearch.common.settings.ClusterSettings;
|
|
27 | 28 | import org.opensearch.http.HttpServerChannel;
|
28 | 29 | import org.opensearch.http.reactor.netty4.ssl.SslUtils;
|
29 | 30 | import org.opensearch.plugins.SecureHttpTransportSettingsProvider;
|
| 31 | +import org.opensearch.plugins.SecureHttpTransportSettingsProvider.SecureHttpTransportParameters; |
30 | 32 | import org.opensearch.rest.RestHandler;
|
31 | 33 | import org.opensearch.rest.RestRequest.Method;
|
32 | 34 | import org.opensearch.telemetry.tracing.Tracer;
|
33 | 35 | import org.opensearch.threadpool.ThreadPool;
|
34 | 36 | import org.opensearch.transport.reactor.SharedGroupFactory;
|
35 | 37 | import org.opensearch.transport.reactor.netty4.Netty4Utils;
|
36 | 38 |
|
37 |
| -import javax.net.ssl.SSLEngine; |
38 |
| -import javax.net.ssl.SSLException; |
39 |
| -import javax.net.ssl.SSLSessionContext; |
| 39 | +import javax.net.ssl.KeyManagerFactory; |
40 | 40 |
|
41 | 41 | import java.net.InetSocketAddress;
|
42 | 42 | import java.net.SocketOption;
|
43 | 43 | import java.time.Duration;
|
44 | 44 | import java.util.Arrays;
|
45 |
| -import java.util.List; |
46 | 45 | import java.util.Optional;
|
47 | 46 |
|
48 | 47 | import io.netty.buffer.ByteBuf;
|
49 |
| -import io.netty.buffer.ByteBufAllocator; |
50 | 48 | import io.netty.channel.ChannelOption;
|
51 | 49 | import io.netty.channel.socket.nio.NioChannelOption;
|
52 | 50 | import io.netty.handler.codec.http.DefaultLastHttpContent;
|
53 | 51 | import io.netty.handler.codec.http.FullHttpResponse;
|
54 | 52 | import io.netty.handler.codec.http.HttpContent;
|
55 |
| -import io.netty.handler.ssl.ApplicationProtocolNegotiator; |
| 53 | +import io.netty.handler.ssl.ApplicationProtocolConfig; |
| 54 | +import io.netty.handler.ssl.ApplicationProtocolNames; |
56 | 55 | import io.netty.handler.ssl.SslContext;
|
| 56 | +import io.netty.handler.ssl.SslContextBuilder; |
| 57 | +import io.netty.handler.ssl.SupportedCipherSuiteFilter; |
57 | 58 | import io.netty.handler.timeout.ReadTimeoutException;
|
58 |
| -import io.netty.util.ReferenceCountUtil; |
59 | 59 | import org.reactivestreams.Publisher;
|
60 | 60 | import reactor.core.publisher.Mono;
|
61 | 61 | import reactor.core.scheduler.Scheduler;
|
@@ -306,59 +306,33 @@ private HttpServer configure(final HttpServer server) throws Exception {
|
306 | 306 |
|
307 | 307 | // Configure SSL context if available
|
308 | 308 | if (secureHttpTransportSettingsProvider != null) {
|
309 |
| - final SSLEngine engine = secureHttpTransportSettingsProvider.buildSecureHttpServerEngine(settings, this) |
310 |
| - .orElseGet(SslUtils::createDefaultServerSSLEngine); |
311 |
| - |
312 |
| - try { |
313 |
| - final List<String> cipherSuites = Arrays.asList(engine.getEnabledCipherSuites()); |
314 |
| - final List<String> applicationProtocols = Arrays.asList(engine.getSSLParameters().getApplicationProtocols()); |
315 |
| - |
316 |
| - configured = configured.secure(spec -> spec.sslContext(new SslContext() { |
317 |
| - @Override |
318 |
| - public SSLSessionContext sessionContext() { |
319 |
| - throw new UnsupportedOperationException(); /* server only, should never be called */ |
320 |
| - } |
321 |
| - |
322 |
| - @Override |
323 |
| - public SSLEngine newEngine(ByteBufAllocator alloc, String peerHost, int peerPort) { |
324 |
| - throw new UnsupportedOperationException(); /* server only, should never be called */ |
325 |
| - } |
326 |
| - |
327 |
| - @Override |
328 |
| - public SSLEngine newEngine(ByteBufAllocator alloc) { |
329 |
| - try { |
330 |
| - return secureHttpTransportSettingsProvider.buildSecureHttpServerEngine( |
331 |
| - settings, |
332 |
| - ReactorNetty4HttpServerTransport.this |
333 |
| - ).orElseGet(SslUtils::createDefaultServerSSLEngine); |
334 |
| - } catch (final SSLException ex) { |
335 |
| - throw new UnsupportedOperationException("Unable to create SSLEngine", ex); |
336 |
| - } |
337 |
| - } |
338 |
| - |
339 |
| - @Override |
340 |
| - public boolean isClient() { |
341 |
| - return false; /* server only */ |
342 |
| - } |
343 |
| - |
344 |
| - @Override |
345 |
| - public List<String> cipherSuites() { |
346 |
| - return cipherSuites; |
347 |
| - } |
| 309 | + final Optional<SecureHttpTransportParameters> parameters = secureHttpTransportSettingsProvider.parameters(settings); |
| 310 | + |
| 311 | + final KeyManagerFactory keyManagerFactory = parameters.flatMap(SecureHttpTransportParameters::keyManagerFactory) |
| 312 | + .orElseThrow(() -> new OpenSearchException("The KeyManagerFactory instance is not provided")); |
| 313 | + |
| 314 | + final SslContextBuilder sslContextBuilder = SslContextBuilder.forServer(keyManagerFactory); |
| 315 | + parameters.flatMap(SecureHttpTransportParameters::trustManagerFactory).ifPresent(sslContextBuilder::trustManager); |
| 316 | + parameters.map(SecureHttpTransportParameters::cipherSuites) |
| 317 | + .ifPresent(ciphers -> sslContextBuilder.ciphers(ciphers, SupportedCipherSuiteFilter.INSTANCE)); |
| 318 | + |
| 319 | + final SslContext sslContext = sslContextBuilder.protocols( |
| 320 | + parameters.map(SecureHttpTransportParameters::protocols).orElseGet(() -> Arrays.asList(SslUtils.DEFAULT_SSL_PROTOCOLS)) |
| 321 | + ) |
| 322 | + .applicationProtocolConfig( |
| 323 | + new ApplicationProtocolConfig( |
| 324 | + ApplicationProtocolConfig.Protocol.ALPN, |
| 325 | + // NO_ADVERTISE is currently the only mode supported by both OpenSsl and JDK providers. |
| 326 | + ApplicationProtocolConfig.SelectorFailureBehavior.NO_ADVERTISE, |
| 327 | + // ACCEPT is currently the only mode supported by both OpenSsl and JDK providers. |
| 328 | + ApplicationProtocolConfig.SelectedListenerFailureBehavior.ACCEPT, |
| 329 | + ApplicationProtocolNames.HTTP_2, |
| 330 | + ApplicationProtocolNames.HTTP_1_1 |
| 331 | + ) |
| 332 | + ) |
| 333 | + .build(); |
348 | 334 |
|
349 |
| - @Override |
350 |
| - public ApplicationProtocolNegotiator applicationProtocolNegotiator() { |
351 |
| - return new ApplicationProtocolNegotiator() { |
352 |
| - @Override |
353 |
| - public List<String> protocols() { |
354 |
| - return applicationProtocols; |
355 |
| - } |
356 |
| - }; |
357 |
| - } |
358 |
| - }).build()).protocol(HttpProtocol.HTTP11, HttpProtocol.H2); |
359 |
| - } finally { |
360 |
| - ReferenceCountUtil.release(engine); |
361 |
| - } |
| 335 | + configured = configured.secure(spec -> spec.sslContext(sslContext)).protocol(HttpProtocol.HTTP11, HttpProtocol.H2); |
362 | 336 | } else {
|
363 | 337 | configured = configured.protocol(HttpProtocol.HTTP11, HttpProtocol.H2C);
|
364 | 338 | }
|
|
0 commit comments