Skip to content

Commit e7575f6

Browse files
fix: Fix SSL Context switching (#3531)
1 parent a4f71d1 commit e7575f6

File tree

3 files changed

+28
-34
lines changed

3 files changed

+28
-34
lines changed

integration-tests/src/test/java/org/zowe/apiml/util/config/ConfigReaderZaasClient.java

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,19 @@
1818
public class ConfigReaderZaasClient {
1919

2020
public static ConfigProperties getConfigProperties() {
21-
22-
ConfigProperties configProperties = new ConfigProperties();
23-
24-
25-
configProperties.setApimlHost(environmentConfiguration().getGatewayServiceConfiguration().getHost());
26-
configProperties.setApimlPort(environmentConfiguration().getGatewayServiceConfiguration().getPort() + "");
27-
configProperties.setApimlBaseUrl(ROUTED_AUTH);
28-
configProperties.setKeyStorePath(environmentConfiguration().getTlsConfiguration().getKeyStore());
29-
configProperties.setKeyStorePassword(environmentConfiguration().getTlsConfiguration().getKeyStorePassword());
30-
configProperties.setKeyStoreType(environmentConfiguration().getTlsConfiguration().getKeyStoreType());
31-
configProperties.setTrustStorePath(environmentConfiguration().getTlsConfiguration().getTrustStore());
32-
configProperties.setTrustStorePassword(environmentConfiguration().getTlsConfiguration().getTrustStorePassword());
33-
configProperties.setTrustStoreType(environmentConfiguration().getTlsConfiguration().getTrustStoreType());
34-
configProperties.setNonStrictVerifySslCertificatesOfServices(environmentConfiguration().getTlsConfiguration().isNonStrictVerifySslCertificatesOfServices());
35-
return configProperties;
21+
return ConfigProperties.builder()
22+
.apimlHost(environmentConfiguration().getGatewayServiceConfiguration().getHost())
23+
.apimlPort(environmentConfiguration().getGatewayServiceConfiguration().getPort() + "")
24+
.apimlBaseUrl(ROUTED_AUTH)
25+
.keyStorePath(environmentConfiguration().getTlsConfiguration().getKeyStore())
26+
.keyStorePassword(environmentConfiguration().getTlsConfiguration().getKeyStorePassword())
27+
.keyStoreType(environmentConfiguration().getTlsConfiguration().getKeyStoreType())
28+
.trustStorePath(environmentConfiguration().getTlsConfiguration().getTrustStore())
29+
.trustStorePassword(environmentConfiguration().getTlsConfiguration().getTrustStorePassword())
30+
.trustStoreType(environmentConfiguration().getTlsConfiguration().getTrustStoreType())
31+
.nonStrictVerifySslCertificatesOfServices(environmentConfiguration().getTlsConfiguration().isNonStrictVerifySslCertificatesOfServices())
32+
.build();
3633
}
34+
3735
}
3836

zaas-client/src/main/java/org/zowe/apiml/zaasclient/config/ConfigProperties.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ public class ConfigProperties {
2929
private char[] trustStorePassword;
3030
private boolean httpOnly;
3131
private boolean nonStrictVerifySslCertificatesOfServices;
32+
@Builder.Default
33+
private String protocol = "TLS";
3234

3335
@SuppressWarnings("squid:S1075")
3436
private static final String OLD_PATH_FORMAT = "/api/v1/gateway";
@@ -41,6 +43,7 @@ public class ConfigProperties {
4143
@Tolerate
4244
public ConfigProperties() {
4345
// lombok Builder.Default bug workaround
46+
this.protocol = "TLS";
4447
this.tokenPrefix = "apimlAuthenticationToken";
4548
}
4649

@@ -54,6 +57,7 @@ public ConfigProperties withoutKeyStore() {
5457
.trustStorePassword(trustStorePassword)
5558
.httpOnly(httpOnly)
5659
.nonStrictVerifySslCertificatesOfServices(nonStrictVerifySslCertificatesOfServices)
60+
.protocol(protocol)
5761
.tokenPrefix(tokenPrefix)
5862
.build();
5963
}

zaas-client/src/main/java/org/zowe/apiml/zaasclient/service/internal/ZaasHttpsClientProvider.java

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,29 +19,22 @@
1919
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
2020
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
2121
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
22-
import org.apache.hc.client5.http.ssl.DefaultHostnameVerifier;
22+
import org.apache.hc.client5.http.ssl.HttpsSupport;
2323
import org.apache.hc.client5.http.ssl.NoopHostnameVerifier;
2424
import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory;
2525
import org.apache.hc.core5.util.Timeout;
2626
import org.zowe.apiml.zaasclient.config.ConfigProperties;
2727
import org.zowe.apiml.zaasclient.exception.ZaasConfigurationErrorCodes;
2828
import org.zowe.apiml.zaasclient.exception.ZaasConfigurationException;
2929

30-
import javax.net.ssl.HostnameVerifier;
31-
import javax.net.ssl.HttpsURLConnection;
3230
import javax.net.ssl.KeyManagerFactory;
3331
import javax.net.ssl.SSLContext;
3432
import javax.net.ssl.TrustManagerFactory;
3533
import java.io.FileInputStream;
3634
import java.io.IOException;
3735
import java.io.InputStream;
3836
import java.net.URL;
39-
import java.security.KeyManagementException;
40-
import java.security.KeyStore;
41-
import java.security.KeyStoreException;
42-
import java.security.NoSuchAlgorithmException;
43-
import java.security.SecureRandom;
44-
import java.security.UnrecoverableKeyException;
37+
import java.security.*;
4538
import java.security.cert.CertificateException;
4639
import java.util.regex.Matcher;
4740
import java.util.regex.Pattern;
@@ -50,30 +43,29 @@
5043
class ZaasHttpsClientProvider implements CloseableClientProvider {
5144
private static final int REQUEST_TIMEOUT = 30 * 1000;
5245

53-
5446
private static final Pattern KEYRING_PATTERN = Pattern.compile("^(safkeyring[^:]*):/{2,4}([^/]+)/([^/]+)$");
5547

48+
private ConfigProperties configProperties;
49+
5650
private TrustManagerFactory tmf;
5751
private KeyManagerFactory kmf;
5852

5953
private final char[] keyStorePassword;
6054
private final String keyStoreType;
6155
private final String keyStorePath;
62-
private final HostnameVerifier hostnameVerifier;
6356

6457
private final CookieStore cookieStore = new BasicCookieStore();
6558

6659
private CloseableHttpClient httpsClient;
6760

6861
public ZaasHttpsClientProvider(ConfigProperties configProperties) throws ZaasConfigurationException {
69-
70-
7162
if (configProperties.getTrustStorePath() == null) {
7263
throw new ZaasConfigurationException(ZaasConfigurationErrorCodes.TRUST_STORE_NOT_PROVIDED);
7364
}
7465

66+
this.configProperties = configProperties;
67+
7568
initializeTrustManagerFactory(configProperties.getTrustStorePath(), configProperties.getTrustStoreType(), configProperties.getTrustStorePassword());
76-
this.hostnameVerifier = configProperties.isNonStrictVerifySslCertificatesOfServices() ? new NoopHostnameVerifier() : new DefaultHostnameVerifier();
7769
this.keyStorePath = configProperties.getKeyStorePath();
7870
this.keyStorePassword = configProperties.getKeyStorePassword();
7971
this.keyStoreType = configProperties.getKeyStoreType();
@@ -104,7 +96,10 @@ public synchronized CloseableHttpClient getHttpClient() throws ZaasConfiguration
10496
if (kmf == null) {
10597
initializeKeyStoreManagerFactory();
10698
}
107-
var manager = PoolingHttpClientConnectionManagerBuilder.create().setSSLSocketFactory(new SSLConnectionSocketFactory(getSSLContext())).build();
99+
var hostnameVerifier = configProperties.isNonStrictVerifySslCertificatesOfServices() ?
100+
new NoopHostnameVerifier() : HttpsSupport.getDefaultHostnameVerifier();
101+
var sslConnectionSocketFactory = new SSLConnectionSocketFactory(getSSLContext(), hostnameVerifier);
102+
var manager = PoolingHttpClientConnectionManagerBuilder.create().setSSLSocketFactory(sslConnectionSocketFactory).build();
108103

109104
httpsClient = createSecureHttpClient(manager).build();
110105
}
@@ -169,14 +164,12 @@ private InputStream getCorrectInputStream(String uri) throws IOException {
169164

170165
private SSLContext getSSLContext() throws ZaasConfigurationException {
171166
try {
172-
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
167+
SSLContext sslContext = SSLContext.getInstance(configProperties.getProtocol());
173168
sslContext.init(
174169
kmf != null ? kmf.getKeyManagers() : null,
175170
tmf.getTrustManagers(),
176171
new SecureRandom()
177172
);
178-
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
179-
HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
180173
return sslContext;
181174
} catch (NoSuchAlgorithmException | KeyManagementException e) {
182175
throw new ZaasConfigurationException(ZaasConfigurationErrorCodes.WRONG_CRYPTO_CONFIGURATION, e);
@@ -197,7 +190,6 @@ public HttpClientBuilder createSecureHttpClient(PoolingHttpClientConnectionManag
197190
.evictExpiredConnections()
198191
.evictIdleConnections(Timeout.ofSeconds(REQUEST_TIMEOUT))
199192
.disableAuthCaching();
200-
201193
}
202194

203195
}

0 commit comments

Comments
 (0)