Skip to content

Commit 6a1c4de

Browse files
committed
Introduce AHCConfig#isFilterInsecureCipherSuites, close AsyncHttpClient#1510
Motivation: Some use cases don’t care much about security (load testing, web crawling). Those users don’t understand that their security is broken, while their website can be displayed in web browsers and other user agents. Modifications: Introduce a new config option that bypasses insecured and weak cipher suites filtering done in Netty. Result: It’s now possible to lower security. Use at own risks thought!
1 parent 988dd57 commit 6a1c4de

File tree

5 files changed

+52
-0
lines changed

5 files changed

+52
-0
lines changed

client/src/main/java/org/asynchttpclient/AsyncHttpClientConfig.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,11 @@ public interface AsyncHttpClientConfig {
238238
*/
239239
String[] getEnabledCipherSuites();
240240

241+
/**
242+
* @return if insecured cipher suites must be filtered out (only used when not explicitly passing enabled cipher suites)
243+
*/
244+
boolean isFilterInsecureCipherSuites();
245+
241246
/**
242247
* @return the size of the SSL session cache, 0 means using the default value
243248
*/

client/src/main/java/org/asynchttpclient/DefaultAsyncHttpClientConfig.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ public class DefaultAsyncHttpClientConfig implements AsyncHttpClientConfig {
9393
private final int handshakeTimeout;
9494
private final String[] enabledProtocols;
9595
private final String[] enabledCipherSuites;
96+
private final boolean filterInsecureCipherSuites;
9697
private final int sslSessionCacheSize;
9798
private final int sslSessionTimeout;
9899
private final SslContext sslContext;
@@ -170,6 +171,7 @@ private DefaultAsyncHttpClientConfig(// http
170171
int handshakeTimeout,
171172
String[] enabledProtocols,
172173
String[] enabledCipherSuites,
174+
boolean filterInsecureCipherSuites,
173175
int sslSessionCacheSize,
174176
int sslSessionTimeout,
175177
SslContext sslContext,
@@ -255,6 +257,7 @@ private DefaultAsyncHttpClientConfig(// http
255257
this.handshakeTimeout = handshakeTimeout;
256258
this.enabledProtocols = enabledProtocols;
257259
this.enabledCipherSuites = enabledCipherSuites;
260+
this.filterInsecureCipherSuites = filterInsecureCipherSuites;
258261
this.sslSessionCacheSize = sslSessionCacheSize;
259262
this.sslSessionTimeout = sslSessionTimeout;
260263
this.sslContext = sslContext;
@@ -484,6 +487,11 @@ public String[] getEnabledCipherSuites() {
484487
return enabledCipherSuites;
485488
}
486489

490+
@Override
491+
public boolean isFilterInsecureCipherSuites() {
492+
return filterInsecureCipherSuites;
493+
}
494+
487495
@Override
488496
public int getSslSessionCacheSize() {
489497
return sslSessionCacheSize;
@@ -689,6 +697,7 @@ public static class Builder {
689697
private int handshakeTimeout = defaultHandshakeTimeout();
690698
private String[] enabledProtocols = defaultEnabledProtocols();
691699
private String[] enabledCipherSuites = defaultEnabledCipherSuites();
700+
private boolean filterInsecureCipherSuites = defaultFilterInsecureCipherSuites();
692701
private int sslSessionCacheSize = defaultSslSessionCacheSize();
693702
private int sslSessionTimeout = defaultSslSessionTimeout();
694703
private SslContext sslContext;
@@ -766,6 +775,7 @@ public Builder(AsyncHttpClientConfig config) {
766775
handshakeTimeout = config.getHandshakeTimeout();
767776
enabledProtocols = config.getEnabledProtocols();
768777
enabledCipherSuites = config.getEnabledCipherSuites();
778+
filterInsecureCipherSuites = config.isFilterInsecureCipherSuites();
769779
sslSessionCacheSize = config.getSslSessionCacheSize();
770780
sslSessionTimeout = config.getSslSessionTimeout();
771781
sslContext = config.getSslContext();
@@ -1010,6 +1020,11 @@ public Builder setEnabledCipherSuites(String[] enabledCipherSuites) {
10101020
return this;
10111021
}
10121022

1023+
public Builder setFilterInsecureCipherSuites(boolean filterInsecureCipherSuites) {
1024+
this.filterInsecureCipherSuites = filterInsecureCipherSuites;
1025+
return this;
1026+
}
1027+
10131028
public Builder setSslSessionCacheSize(Integer sslSessionCacheSize) {
10141029
this.sslSessionCacheSize = sslSessionCacheSize;
10151030
return this;
@@ -1225,6 +1240,7 @@ public DefaultAsyncHttpClientConfig build() {
12251240
handshakeTimeout,
12261241
enabledProtocols,
12271242
enabledCipherSuites,
1243+
filterInsecureCipherSuites,
12281244
sslSessionCacheSize,
12291245
sslSessionTimeout,
12301246
sslContext,

client/src/main/java/org/asynchttpclient/config/AsyncHttpClientConfigDefaults.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public final class AsyncHttpClientConfigDefaults {
3434
public static final String USER_AGENT_CONFIG = "userAgent";
3535
public static final String ENABLED_PROTOCOLS_CONFIG = "enabledProtocols";
3636
public static final String ENABLED_CIPHER_SUITES_CONFIG = "enabledCipherSuites";
37+
public static final String FILTER_INSECURE_CIPHER_SUITES_CONFIG = "filterInsecureCipherSuites";
3738
public static final String USE_PROXY_SELECTOR_CONFIG = "useProxySelector";
3839
public static final String USE_PROXY_PROPERTIES_CONFIG = "useProxyProperties";
3940
public static final String VALIDATE_RESPONSE_HEADERS_CONFIG = "validateResponseHeaders";
@@ -144,6 +145,10 @@ public static String[] defaultEnabledCipherSuites() {
144145
return AsyncHttpClientConfigHelper.getAsyncHttpClientConfig().getStringArray(ASYNC_CLIENT_CONFIG_ROOT + ENABLED_CIPHER_SUITES_CONFIG);
145146
}
146147

148+
public static boolean defaultFilterInsecureCipherSuites() {
149+
return AsyncHttpClientConfigHelper.getAsyncHttpClientConfig().getBoolean(ASYNC_CLIENT_CONFIG_ROOT + FILTER_INSECURE_CIPHER_SUITES_CONFIG);
150+
}
151+
147152
public static boolean defaultUseProxySelector() {
148153
return AsyncHttpClientConfigHelper.getAsyncHttpClientConfig().getBoolean(ASYNC_CLIENT_CONFIG_ROOT + USE_PROXY_SELECTOR_CONFIG);
149154
}

client/src/main/java/org/asynchttpclient/netty/ssl/DefaultSslEngineFactory.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,33 @@
2020
import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
2121
import org.asynchttpclient.AsyncHttpClientConfig;
2222

23+
import javax.net.ssl.SSLContext;
2324
import javax.net.ssl.SSLEngine;
2425
import javax.net.ssl.SSLException;
2526
import java.util.Arrays;
27+
import java.util.List;
2628

2729
import static org.asynchttpclient.util.MiscUtils.isNonEmpty;
2830

2931
public class DefaultSslEngineFactory extends SslEngineFactoryBase {
3032

33+
// TODO replace with a custom CipherSuiteFilter once https://github.com/netty/netty/issues/7673 is fixed
34+
private static final List<String> JDK_SUPPORTED_CIPHER_SUITES;
35+
36+
static {
37+
SSLContext context;
38+
try {
39+
context = SSLContext.getInstance("TLS");
40+
context.init(null, null, null);
41+
} catch (Exception e) {
42+
throw new Error("Failed to initialize the default SSL context", e);
43+
}
44+
45+
SSLEngine engine = context.createSSLEngine();
46+
47+
JDK_SUPPORTED_CIPHER_SUITES = Arrays.asList(engine.getSupportedCipherSuites());
48+
}
49+
3150
private volatile SslContext sslContext;
3251

3352
private SslContext buildSslContext(AsyncHttpClientConfig config) throws SSLException {
@@ -46,6 +65,8 @@ private SslContext buildSslContext(AsyncHttpClientConfig config) throws SSLExcep
4665

4766
if (isNonEmpty(config.getEnabledCipherSuites())) {
4867
sslContextBuilder.ciphers(Arrays.asList(config.getEnabledCipherSuites()));
68+
} else if (!config.isFilterInsecureCipherSuites() && !config.isUseOpenSsl()) {
69+
sslContextBuilder.ciphers(JDK_SUPPORTED_CIPHER_SUITES);
4970
}
5071

5172
if (config.isUseInsecureTrustManager()) {

extras/typesafeconfig/src/main/java/org/asynchttpclient/extras/typesafeconfig/AsyncHttpClientTypesafeConfig.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,11 @@ public String[] getEnabledCipherSuites() {
208208
return getListOpt(ENABLED_CIPHER_SUITES_CONFIG).map(list -> list.toArray(new String[0])).orElse(defaultEnabledCipherSuites());
209209
}
210210

211+
@Override
212+
public boolean isFilterInsecureCipherSuites() {
213+
return getBooleanOpt(FILTER_INSECURE_CIPHER_SUITES_CONFIG).orElse(defaultFilterInsecureCipherSuites());
214+
}
215+
211216
@Override
212217
public int getSslSessionCacheSize() {
213218
return getIntegerOpt(SSL_SESSION_CACHE_SIZE_CONFIG).orElse(defaultSslSessionCacheSize());

0 commit comments

Comments
 (0)