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");
}
}