Skip to content

Commit d5ec23e

Browse files
authored
HDDS-10819. Respect ssl.server.include.cipher.list and ssl.enabled.protocols in HttpServer2 (#10111)
Generated-by: Claude - Opus 4.6
1 parent 7eaf46f commit d5ec23e

5 files changed

Lines changed: 366 additions & 12 deletions

File tree

hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/OzoneConfigKeys.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,7 @@ public final class OzoneConfigKeys {
557557
"ozone.http.policy";
558558
public static final String OZONE_HTTP_POLICY_DEFAULT =
559559
HttpConfig.Policy.HTTP_ONLY.name();
560+
public static final String OZONE_SSL_ENABLED_PROTOCOLS = "ozone.ssl.enabled.protocols";
560561
public static final String OZONE_SERVER_HTTPS_KEYSTORE_RESOURCE_KEY =
561562
"ozone.https.server.keystore.resource";
562563
public static final String OZONE_SERVER_HTTPS_KEYSTORE_RESOURCE_DEFAULT =

hadoop-hdds/common/src/main/resources/ozone-default.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3747,6 +3747,15 @@
37473747
<description>Keystore key password for HTTPS SSL configuration
37483748
</description>
37493749
</property>
3750+
<property>
3751+
<name>ozone.ssl.enabled.protocols</name>
3752+
<tag>OZONE,SECURITY,CRYPTO_COMPLIANCE</tag>
3753+
<value/>
3754+
<description>
3755+
The supported SSL protocols used to restrict connections towards the WebUI of different components,
3756+
and the S3 GateWay.
3757+
</description>
3758+
</property>
37503759
<property>
37513760
<name>ssl.server.keystore.location</name>
37523761
<tag>OZONE, SECURITY, MANAGEMENT</tag>

hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/BaseHttpServer.java

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import org.apache.hadoop.ozone.OzoneSecurityUtil;
5757
import org.apache.hadoop.security.UserGroupInformation;
5858
import org.apache.hadoop.security.authorize.AccessControlList;
59+
import org.apache.hadoop.security.ssl.SSLFactory;
5960
import org.eclipse.jetty.webapp.WebAppContext;
6061
import org.slf4j.Logger;
6162
import org.slf4j.LoggerFactory;
@@ -370,23 +371,28 @@ public void updateConnectorAddress() {
370371
}
371372
}
372373

373-
public static HttpServer2.Builder loadSslConfToHttpServerBuilder(
374-
HttpServer2.Builder builder, ConfigurationSource sslConf) {
375-
return builder
374+
public static void loadSslConfToHttpServerBuilder(HttpServer2.Builder builder, ConfigurationSource sslConf) {
375+
builder
376376
.needsClientAuth(
377377
sslConf.getBoolean(OZONE_CLIENT_HTTPS_NEED_AUTH_KEY,
378378
OZONE_CLIENT_HTTPS_NEED_AUTH_DEFAULT))
379379
.keyPassword(getPassword(sslConf, OZONE_SERVER_HTTPS_KEYPASSWORD_KEY))
380-
.keyStore(sslConf.get("ssl.server.keystore.location"),
380+
.keyStore(
381+
sslConf.get(SSLFactory.SSL_SERVER_KEYSTORE_LOCATION),
381382
getPassword(sslConf, OZONE_SERVER_HTTPS_KEYSTORE_PASSWORD_KEY),
382-
sslConf.get(HddsConfigKeys.HDDS_HTTP_SERVER_KEYSTORE_TYPE,
383-
HddsConfigKeys.HDDS_HTTP_SERVER_KEYSTORE_TYPE_DEFAULT))
384-
.trustStore(sslConf.get("ssl.server.truststore.location"),
383+
sslConf.get(
384+
HddsConfigKeys.HDDS_HTTP_SERVER_KEYSTORE_TYPE,
385+
HddsConfigKeys.HDDS_HTTP_SERVER_KEYSTORE_TYPE_DEFAULT)
386+
)
387+
.trustStore(
388+
sslConf.get(SSLFactory.SSL_SERVER_TRUSTSTORE_LOCATION),
385389
getPassword(sslConf, OZONE_SERVER_HTTPS_TRUSTSTORE_PASSWORD_KEY),
386-
sslConf.get(HddsConfigKeys.HDDS_HTTP_SERVER_TRUSTSTORE_TYPE,
387-
HddsConfigKeys.HDDS_HTTP_SERVER_TRUSTSTORE_TYPE_DEFAULT))
388-
.excludeCiphers(
389-
sslConf.get("ssl.server.exclude.cipher.list"));
390+
sslConf.get(
391+
HddsConfigKeys.HDDS_HTTP_SERVER_TRUSTSTORE_TYPE,
392+
HddsConfigKeys.HDDS_HTTP_SERVER_TRUSTSTORE_TYPE_DEFAULT)
393+
)
394+
.includeCiphers(sslConf.get(SSLFactory.SSL_SERVER_INCLUDE_CIPHER_LIST))
395+
.excludeCiphers(sslConf.get(SSLFactory.SSL_SERVER_EXCLUDE_CIPHER_LIST));
390396
}
391397

392398
/**

hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/server/http/HttpServer2.java

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import java.nio.file.Files;
4040
import java.nio.file.Paths;
4141
import java.util.ArrayList;
42+
import java.util.Arrays;
4243
import java.util.Collections;
4344
import java.util.Enumeration;
4445
import java.util.HashMap;
@@ -250,6 +251,7 @@ public static class Builder {
250251
private String authFilterConfigurationPrefix =
251252
"hadoop.http.authentication.";
252253
private String excludeCiphers;
254+
private String includeCiphers;
253255

254256
private boolean xFrameEnabled;
255257
private XFrameOption xFrameOption = XFrameOption.SAMEORIGIN;
@@ -377,6 +379,11 @@ public Builder excludeCiphers(String pExcludeCiphers) {
377379
return this;
378380
}
379381

382+
public Builder includeCiphers(String pIncludeCiphers) {
383+
this.includeCiphers = pIncludeCiphers;
384+
return this;
385+
}
386+
380387
/**
381388
* Adds the ability to control X_FRAME_OPTIONS on HttpServer2.
382389
* @param enabled - True enables X_FRAME_OPTIONS false disables it.
@@ -448,6 +455,7 @@ private void loadSSLConfiguration() throws IOException {
448455
trustStoreType = sslConf.get(SSLFactory.SSL_SERVER_TRUSTSTORE_TYPE,
449456
SSLFactory.SSL_SERVER_TRUSTSTORE_TYPE_DEFAULT);
450457
excludeCiphers = sslConf.get(SSLFactory.SSL_SERVER_EXCLUDE_CIPHER_LIST);
458+
includeCiphers = sslConf.get(SSLFactory.SSL_SERVER_INCLUDE_CIPHER_LIST);
451459
}
452460

453461
public Builder withoutDefaultApps() {
@@ -565,17 +573,42 @@ private ServerConnector createHttpsChannelConnector(
565573
sslContextFactory.setTrustStorePassword(trustStorePassword);
566574
}
567575
}
568-
if (null != excludeCiphers && !excludeCiphers.isEmpty()) {
576+
if (excludeCiphers != null && !excludeCiphers.isEmpty()) {
569577
sslContextFactory.setExcludeCipherSuites(
570578
StringUtils.getTrimmedStrings(excludeCiphers));
571579
LOG.info("Excluded Cipher List: {}", excludeCiphers);
572580
}
573581

582+
if (includeCiphers != null && !includeCiphers.isEmpty()) {
583+
sslContextFactory.setIncludeCipherSuites(
584+
StringUtils.getTrimmedStrings(includeCiphers));
585+
LOG.info("Included Cipher List: {}", includeCiphers);
586+
}
587+
588+
setEnabledProtocols(sslContextFactory);
589+
574590
conn.addFirstConnectionFactory(new SslConnectionFactory(sslContextFactory,
575591
HttpVersion.HTTP_1_1.asString()));
576592

577593
return conn;
578594
}
595+
596+
private void setEnabledProtocols(SslContextFactory sslContextFactory) {
597+
String enabledProtocols = conf.get(OzoneConfigKeys.OZONE_SSL_ENABLED_PROTOCOLS,
598+
conf.get(SSLFactory.SSL_ENABLED_PROTOCOLS_KEY, SSLFactory.SSL_ENABLED_PROTOCOLS_DEFAULT));
599+
if (!enabledProtocols.equals(SSLFactory.SSL_ENABLED_PROTOCOLS_DEFAULT)) {
600+
List<String> originalExcludedProtocols = Arrays.asList(sslContextFactory.getExcludeProtocols());
601+
String[] enabledProtocolsArray = StringUtils.getTrimmedStrings(enabledProtocols);
602+
603+
List<String> finalExcludedProtocols = new ArrayList<>(originalExcludedProtocols);
604+
finalExcludedProtocols.removeAll(Arrays.asList(enabledProtocolsArray));
605+
606+
sslContextFactory.setExcludeProtocols(finalExcludedProtocols.toArray(new String[0]));
607+
LOG.info("Disabled protocols: {}", finalExcludedProtocols);
608+
sslContextFactory.setIncludeProtocols(enabledProtocolsArray);
609+
LOG.info("Enabled protocols: {}", enabledProtocols);
610+
}
611+
}
579612
}
580613

581614
private HttpServer2(final Builder b) throws IOException {

0 commit comments

Comments
 (0)