From f1ab7f18c423a9cfc59292d25fa178e73715b85b Mon Sep 17 00:00:00 2001 From: Aravindan Vijayan Date: Tue, 3 Dec 2019 15:46:21 -0800 Subject: [PATCH] HADOOP-16718. Allow disabling Server Name Indication (SNI) for Jetty. Contributed by Aravindan Vijayan. Signed-off-by: Wei-Chiu Chuang Reviewed-by: Siyao Meng --- .../org/apache/hadoop/http/HttpServer2.java | 27 ++++++++++++++++++- .../src/main/resources/core-default.xml | 8 ++++++ .../conf/TestCommonConfigurationFields.java | 2 +- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer2.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer2.java index 7e7d64423f..13c4ce11a7 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer2.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer2.java @@ -154,6 +154,10 @@ public final class HttpServer2 implements FilterContainer { public static final String FILTER_INITIALIZER_PROPERTY = "hadoop.http.filter.initializers"; + public static final String HTTP_SNI_HOST_CHECK_ENABLED_KEY + = "hadoop.http.sni.host.check.enabled"; + public static final boolean HTTP_SNI_HOST_CHECK_ENABLED_DEFAULT = false; + // The ServletContext attribute where the daemon Configuration // gets stored. public static final String CONF_CONTEXT_ATTRIBUTE = "hadoop.conf"; @@ -233,6 +237,8 @@ public final class HttpServer2 implements FilterContainer { private boolean xFrameEnabled; private XFrameOption xFrameOption = XFrameOption.SAMEORIGIN; + private boolean sniHostCheckEnabled; + public Builder setName(String name){ this.name = name; return this; @@ -377,6 +383,17 @@ public final class HttpServer2 implements FilterContainer { return this; } + /** + * Enable or disable sniHostCheck. + * + * @param sniHostCheckEnabled Enable sniHostCheck if true, else disable it. + * @return Builder. + */ + public Builder setSniHostCheckEnabled(boolean sniHostCheckEnabled) { + this.sniHostCheckEnabled = sniHostCheckEnabled; + return this; + } + /** * A wrapper of {@link Configuration#getPassword(String)}. It returns * String instead of char[]. @@ -471,6 +488,13 @@ public final class HttpServer2 implements FilterContainer { int backlogSize = conf.getInt(HTTP_SOCKET_BACKLOG_SIZE_KEY, HTTP_SOCKET_BACKLOG_SIZE_DEFAULT); + // If setSniHostCheckEnabled() is used to enable SNI hostname check, + // configuration lookup is skipped. + if (!sniHostCheckEnabled) { + sniHostCheckEnabled = conf.getBoolean(HTTP_SNI_HOST_CHECK_ENABLED_KEY, + HTTP_SNI_HOST_CHECK_ENABLED_DEFAULT); + } + for (URI ep : endpoints) { final ServerConnector connector; String scheme = ep.getScheme(); @@ -514,7 +538,8 @@ public final class HttpServer2 implements FilterContainer { private ServerConnector createHttpsChannelConnector( Server server, HttpConfiguration httpConfig) { httpConfig.setSecureScheme(HTTPS_SCHEME); - httpConfig.addCustomizer(new SecureRequestCustomizer()); + httpConfig.addCustomizer( + new SecureRequestCustomizer(sniHostCheckEnabled)); ServerConnector conn = createHttpChannelConnector(server, httpConfig); SslContextFactory.Server sslContextFactory = diff --git a/hadoop-common-project/hadoop-common/src/main/resources/core-default.xml b/hadoop-common-project/hadoop-common/src/main/resources/core-default.xml index 90edb4575a..5d3e5b9b2a 100644 --- a/hadoop-common-project/hadoop-common/src/main/resources/core-default.xml +++ b/hadoop-common-project/hadoop-common/src/main/resources/core-default.xml @@ -3789,4 +3789,12 @@ fs space usage statistics refresh jitter in msec. + + + hadoop.http.sni.host.check.enabled + false + + Enable Server Name Indication (SNI) host check for HTTPS enabled server. + + diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/conf/TestCommonConfigurationFields.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/conf/TestCommonConfigurationFields.java index e784fe928f..1ce23a0eb8 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/conf/TestCommonConfigurationFields.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/conf/TestCommonConfigurationFields.java @@ -226,6 +226,6 @@ public class TestCommonConfigurationFields extends TestConfigurationFieldsBase { // - org.apache.hadoop.io.SequenceFile xmlPropsToSkipCompare.add("io.seqfile.local.dir"); - + xmlPropsToSkipCompare.add("hadoop.http.sni.host.check.enabled"); } }