Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ private void configureSsl(GatewayConfig gatewayConfig, KeyStore trustStore) {
if (truststoreSSLContext != null && trustManager != null) {
final ConnectionSpec.Builder connectionSpecBuilder = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS);
configureSslCiphers(gatewayConfig, truststoreSSLContext, connectionSpecBuilder);
configureSslProtocols(gatewayConfig, connectionSpecBuilder, truststoreSSLContext);
configureSslProtocols(gatewayConfig, truststoreSSLContext, connectionSpecBuilder);
final OkHttpClient.Builder builder = getHttpClient().newBuilder();
builder.connectionSpecs(List.of(connectionSpecBuilder.build()));
builder.sslSocketFactory(truststoreSSLContext.getSocketFactory(), trustManager);
Expand All @@ -196,12 +196,12 @@ private void configureSslCiphers(GatewayConfig gatewayConfig, SSLContext trustst
connectionSpecBuilder.cipherSuites(sslCiphers);
}

private void configureSslProtocols(GatewayConfig gatewayConfig, ConnectionSpec.Builder connectionSpecBuilder, SSLContext truststoreSSLContext) {
private void configureSslProtocols(GatewayConfig gatewayConfig, SSLContext truststoreSSLContext, ConnectionSpec.Builder connectionSpecBuilder) {
final Set<String> configuredSslProtocols = gatewayConfig.getClouderaManagerClientSSLProtocols();
final boolean isConfigured = configuredSslProtocols != null && !configuredSslProtocols.isEmpty();
final String[] sslProtocols = isConfigured ? configuredSslProtocols.toArray(new String[0]) : truststoreSSLContext.getSupportedSSLParameters().getProtocols();
log.usingSslProtocols(Arrays.toString(sslProtocols), isConfigured);
connectionSpecBuilder.cipherSuites(sslProtocols);
connectionSpecBuilder.tlsVersions(sslProtocols);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package org.apache.knox.gateway.topology.discovery.cm;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertNull;
Expand All @@ -37,7 +38,10 @@
import com.cloudera.api.swagger.model.ApiServiceConfig;
import com.cloudera.api.swagger.model.ApiServiceList;
import okhttp3.Call;
import okhttp3.CipherSuite;
import okhttp3.ConnectionSpec;
import okhttp3.Interceptor;
import okhttp3.TlsVersion;
import org.apache.knox.gateway.config.GatewayConfig;
import org.apache.knox.gateway.services.security.AliasService;
import org.apache.knox.gateway.services.security.AliasServiceException;
Expand Down Expand Up @@ -73,13 +77,15 @@
import javax.security.auth.Subject;
import java.lang.reflect.Type;
import java.net.SocketTimeoutException;
import java.security.KeyStore;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;

public class ClouderaManagerServiceDiscoveryTest {
Expand Down Expand Up @@ -150,16 +156,23 @@ public void testApiClientInterceptorsWhenKerberosIsEnabledAndPasswordIsNotSet()

@Test
public void testApiClientInterceptorsWhenKerberosIsDisabledAndPasswordIsNotSet() {
final String cmClientCipher = "TLS_AES_256_GCM_SHA384";
final String cmClientTlsVersion = "TLSv1.2";
GatewayConfig gwConf = EasyMock.createNiceMock(GatewayConfig.class);
EasyMock.expect(gwConf.getClouderaManagerServiceDiscoveryApiVersion()).andReturn(GatewayConfig.DEFAULT_CLOUDERA_MANAGER_SERVICE_DISCOVERY_API_VERSION).anyTimes();
EasyMock.expect(gwConf.getClouderaManagerClientSSLCiphers()).andReturn(List.of(cmClientCipher)).anyTimes();
EasyMock.expect(gwConf.getClouderaManagerClientSSLProtocols()).andReturn(Set.of(cmClientTlsVersion)).anyTimes();
EasyMock.replay(gwConf);

ServiceDiscoveryConfig sdConfig = createMockDiscoveryConfig(DISCOVERY_URL, DISCOVERY_USER, CLUSTER_NAME);

AliasService aliasService = EasyMock.createNiceMock(AliasService.class);
EasyMock.replay(aliasService);

ApiClient apiClient = new TestDiscoveryApiClient(gwConf, sdConfig, aliasService);
KeyStore trustStore = EasyMock.createNiceMock(KeyStore.class);
EasyMock.replay(trustStore);

ApiClient apiClient = new TestDiscoveryApiClient(gwConf, sdConfig, aliasService, trustStore);

HttpBasicAuth authentication = getBasicAuthentication(apiClient);
assertNotNull(authentication);
Expand All @@ -168,6 +181,26 @@ public void testApiClientInterceptorsWhenKerberosIsDisabledAndPasswordIsNotSet()

List<Interceptor> interceptors = apiClient.getHttpClient().interceptors();
assertEquals(0, interceptors.size());
final List<ConnectionSpec> connectionSpecs = apiClient.getHttpClient().connectionSpecs();
assertEquals(1, connectionSpecs.size());

assertTrue(connectionSpecs.get(0).isTls());

assertNotNull(connectionSpecs.get(0).cipherSuites());
assertFalse(connectionSpecs.get(0).cipherSuites().isEmpty());
assertTrue(containsCipherSuite(connectionSpecs.get(0).cipherSuites(), cmClientCipher));

assertNotNull(connectionSpecs.get(0).tlsVersions());
assertFalse(connectionSpecs.get(0).tlsVersions().isEmpty());
assertTrue(containsTlsVersion(connectionSpecs.get(0).tlsVersions(), cmClientTlsVersion));
}

private boolean containsCipherSuite(List<CipherSuite> cipherSuites, String cipherSuiteNameToCheck) {
return cipherSuites.stream().anyMatch(cipherSuite -> cipherSuite.javaName().equals(cipherSuiteNameToCheck));
}

private boolean containsTlsVersion(List<TlsVersion> tlsVersions, String tlsVersionNameToCheck) {
return tlsVersions.stream().anyMatch(tlsVersion -> tlsVersion.javaName().equals(tlsVersionNameToCheck));
}

@Test
Expand Down Expand Up @@ -1627,7 +1660,11 @@ private static class TestDiscoveryApiClient extends DiscoveryApiClient {
protected AtomicInteger executeCount = new AtomicInteger(0);

TestDiscoveryApiClient(GatewayConfig gatewayConfig, ServiceDiscoveryConfig sdConfig, AliasService aliasService) {
super(gatewayConfig, sdConfig, aliasService, null);
this(gatewayConfig, sdConfig, aliasService, null);
}

TestDiscoveryApiClient(GatewayConfig gatewayConfig, ServiceDiscoveryConfig sdConfig, AliasService aliasService, KeyStore trustStore) {
super(gatewayConfig, sdConfig, aliasService, trustStore);
}

void addResponse(Type type, ApiResponse<?> response) {
Expand Down
Loading