Skip to content

Fixes 2420 by adding hostname verifier field to SSLConfig #2421

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
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 @@ -38,6 +38,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import java.io.IOException;
import java.io.InputStream;
Expand All @@ -64,12 +65,14 @@ protected ApacheDockerHttpClientImpl(
Duration responseTimeout
) {
SSLContext sslContext;
HostnameVerifier hostnameVerifier;
try {
sslContext = sslConfig != null ? sslConfig.getSSLContext() : null;
hostnameVerifier = sslConfig != null ? sslConfig.getHostnameVerifier() : null;
} catch (Exception e) {
throw new RuntimeException(e);
}
HttpClientConnectionOperator connectionOperator = createConnectionOperator(dockerHost, sslContext);
HttpClientConnectionOperator connectionOperator = createConnectionOperator(dockerHost, sslContext, hostnameVerifier);

switch (dockerHost.getScheme()) {
case "unix":
Expand Down Expand Up @@ -139,12 +142,13 @@ protected ApacheDockerHttpClientImpl(

private HttpClientConnectionOperator createConnectionOperator(
URI dockerHost,
SSLContext sslContext
SSLContext sslContext,
HostnameVerifier hostnameVerifier
) {
String dockerHostScheme = dockerHost.getScheme();
String dockerHostPath = dockerHost.getPath();
TlsSocketStrategy tlsSocketStrategy = sslContext != null ?
new DefaultClientTlsStrategy(sslContext) : DefaultClientTlsStrategy.createSystemDefault();
new DefaultClientTlsStrategy(sslContext, hostnameVerifier) : DefaultClientTlsStrategy.createSystemDefault();
return new DefaultHttpClientConnectionOperator(
socksProxy -> {
if ("unix".equalsIgnoreCase(dockerHostScheme)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.ws.rs.ProcessingException;
import javax.ws.rs.client.Client;
Expand Down Expand Up @@ -198,10 +199,12 @@ private JerseyDockerHttpClient(
}

SSLContext sslContext = null;
HostnameVerifier hostnameVerifier = null;

try {
if (sslConfig != null) {
sslContext = sslConfig.getSSLContext();
hostnameVerifier = sslConfig.getHostnameVerifier();
}
} catch (Exception ex) {
throw new DockerClientException("Error in SSL Configuration", ex);
Expand All @@ -225,7 +228,7 @@ private JerseyDockerHttpClient(
throw new IllegalArgumentException("Unsupported protocol scheme: " + dockerHost);
}

connManager = new PoolingHttpClientConnectionManager(getSchemeRegistry(dockerHost, sslContext)) {
connManager = new PoolingHttpClientConnectionManager(getSchemeRegistry(dockerHost, sslContext, hostnameVerifier)) {

@Override
public void close() {
Expand Down Expand Up @@ -272,11 +275,15 @@ private URI sanitizeUrl(URI originalUri) {
return originalUri;
}

private Registry<ConnectionSocketFactory> getSchemeRegistry(URI originalUri, SSLContext sslContext) {
private Registry<ConnectionSocketFactory> getSchemeRegistry(URI originalUri, SSLContext sslContext, HostnameVerifier hostnameVerifier) {
RegistryBuilder<ConnectionSocketFactory> registryBuilder = RegistryBuilder.create();
registryBuilder.register("http", PlainConnectionSocketFactory.getSocketFactory());
if (sslContext != null) {
registryBuilder.register("https", new SSLConnectionSocketFactory(sslContext));
SSLConnectionSocketFactory sslConnectionSocketFactory =
hostnameVerifier == null
? new SSLConnectionSocketFactory(sslContext)
: new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
registryBuilder.register("https", sslConnectionSocketFactory);
}
registryBuilder.register("unix", new UnixConnectionSocketFactory(originalUri));
return registryBuilder.build();
Expand Down Expand Up @@ -380,8 +387,8 @@ public Map<String, List<String>> getHeaders() {
@Override
public InputStream getBody() {
return response.hasEntity()
? response.readEntity(InputStream.class)
: EmptyInputStream.INSTANCE;
? response.readEntity(InputStream.class)
: EmptyInputStream.INSTANCE;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.github.dockerjava.transport;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
Expand All @@ -18,4 +19,13 @@ public interface SSLConfig {
*/
SSLContext getSSLContext() throws KeyManagementException, UnrecoverableKeyException, NoSuchAlgorithmException,
KeyStoreException;

/**
* Get the hostname verifier to use. If null is returned, the transports default hostname verifier will be used.
*
* @return a hostname verifier
*/
default HostnameVerifier getHostnameVerifier() {
return null;
}
}