Skip to content

Commit 7d285fa

Browse files
keshavdandevamutianf
authored andcommitted
feat(bigquery-jdbc): add SSLTrustStoreType and SSLTrustStoreProvider connection properties (googleapis#13858)
1 parent 181e908 commit 7d285fa

6 files changed

Lines changed: 222 additions & 30 deletions

File tree

java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryConnection.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,8 @@ public class BigQueryConnection extends BigQueryNoOpsConnection {
205205
boolean filterTablesOnDefaultDataset;
206206
String sslTrustStorePath;
207207
String sslTrustStorePassword;
208+
String sslTrustStoreType;
209+
String sslTrustStoreProvider;
208210
long maxBytesBilled;
209211
Map<String, String> labels;
210212
Integer httpConnectTimeout;
@@ -277,6 +279,8 @@ public class BigQueryConnection extends BigQueryNoOpsConnection {
277279

278280
this.sslTrustStorePath = ds.getSSLTrustStorePath();
279281
this.sslTrustStorePassword = ds.getSSLTrustStorePassword();
282+
this.sslTrustStoreType = ds.getSSLTrustStoreType();
283+
this.sslTrustStoreProvider = ds.getSSLTrustStoreProvider();
280284
this.httpConnectTimeout = ds.getHttpConnectTimeout();
281285
this.httpReadTimeout = ds.getHttpReadTimeout();
282286

@@ -285,6 +289,8 @@ public class BigQueryConnection extends BigQueryNoOpsConnection {
285289
proxyProperties,
286290
this.sslTrustStorePath,
287291
this.sslTrustStorePassword,
292+
this.sslTrustStoreType,
293+
this.sslTrustStoreProvider,
288294
this.httpConnectTimeout,
289295
this.httpReadTimeout,
290296
this.connectionClassName);
@@ -337,6 +343,8 @@ public class BigQueryConnection extends BigQueryNoOpsConnection {
337343
proxyProperties,
338344
this.sslTrustStorePath,
339345
this.sslTrustStorePassword,
346+
this.sslTrustStoreType,
347+
this.sslTrustStoreProvider,
340348
this.connectionClassName);
341349
this.enableSession = ds.getEnableSession();
342350
this.unsupportedHTAPIFallback = ds.getUnsupportedHTAPIFallback();

java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcProxyUtility.java

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,8 @@ static HttpTransportOptions getHttpTransportOptions(
130130
Map<String, String> proxyProperties,
131131
String sslTrustStorePath,
132132
String sslTrustStorePassword,
133+
String sslTrustStoreType,
134+
String sslTrustStoreProvider,
133135
Integer connectTimeout,
134136
Integer readTimeout,
135137
String callerClassName) {
@@ -143,7 +145,12 @@ static HttpTransportOptions getHttpTransportOptions(
143145
if (hasProxyOrSsl) {
144146
httpTransportOptionsBuilder.setHttpTransportFactory(
145147
getHttpTransportFactory(
146-
proxyProperties, sslTrustStorePath, sslTrustStorePassword, callerClassName));
148+
proxyProperties,
149+
sslTrustStorePath,
150+
sslTrustStorePassword,
151+
sslTrustStoreType,
152+
sslTrustStoreProvider,
153+
callerClassName));
147154
} else {
148155
httpTransportOptionsBuilder.setHttpTransportFactory(() -> DEFAULT_TRANSPORT);
149156
}
@@ -162,6 +169,8 @@ private static HttpTransportFactory getHttpTransportFactory(
162169
Map<String, String> proxyProperties,
163170
String sslTrustStorePath,
164171
String sslTrustStorePassword,
172+
String sslTrustStoreType,
173+
String sslTrustStoreProvider,
165174
String callerClassName) {
166175
LOG.finest("++enter++\t" + callerClassName);
167176
HttpClientBuilder httpClientBuilder = HttpClients.custom();
@@ -182,7 +191,7 @@ private static HttpTransportFactory getHttpTransportFactory(
182191

183192
if (sslTrustStorePath != null) {
184193
try (FileInputStream trustStoreStream = new FileInputStream(sslTrustStorePath)) {
185-
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
194+
KeyStore trustStore = loadKeyStore(sslTrustStoreType, sslTrustStoreProvider);
186195
char[] trustStorePasswordChars =
187196
sslTrustStorePassword != null ? sslTrustStorePassword.toCharArray() : null;
188197
trustStore.load(trustStoreStream, trustStorePasswordChars);
@@ -243,6 +252,8 @@ static TransportChannelProvider getTransportChannelProvider(
243252
Map<String, String> proxyProperties,
244253
String sslTrustStorePath,
245254
String sslTrustStorePassword,
255+
String sslTrustStoreType,
256+
String sslTrustStoreProvider,
246257
String callerClassName) {
247258
LOG.finest("++enter++\t" + callerClassName);
248259
boolean hasProxy = proxyProperties.containsKey(BigQueryJdbcUrlUtility.PROXY_HOST_PROPERTY_NAME);
@@ -271,7 +282,7 @@ public ProxiedSocketAddress proxyFor(SocketAddress socketAddress) {
271282
instanceof io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder) {
272283
try (FileInputStream trustStoreStream =
273284
new FileInputStream(sslTrustStorePath)) {
274-
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
285+
KeyStore trustStore = loadKeyStore(sslTrustStoreType, sslTrustStoreProvider);
275286
char[] trustStorePasswordChars =
276287
sslTrustStorePassword != null
277288
? sslTrustStorePassword.toCharArray()
@@ -300,6 +311,15 @@ public ProxiedSocketAddress proxyFor(SocketAddress socketAddress) {
300311
return transportChannelProvider;
301312
}
302313

314+
private static KeyStore loadKeyStore(String type, String provider)
315+
throws GeneralSecurityException {
316+
String resolvedType =
317+
(type != null && !type.trim().isEmpty()) ? type.trim() : KeyStore.getDefaultType();
318+
return (provider != null && !provider.trim().isEmpty())
319+
? KeyStore.getInstance(resolvedType, provider.trim())
320+
: KeyStore.getInstance(resolvedType);
321+
}
322+
303323
private static HttpConnectProxiedSocketAddress getHttpConnectProxiedSocketAddress(
304324
InetSocketAddress socketAddress, Map<String, String> proxyProperties) {
305325
String proxyHost = proxyProperties.get(BigQueryJdbcUrlUtility.PROXY_HOST_PROPERTY_NAME);

java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/BigQueryJdbcUrlUtility.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.google.common.base.Splitter;
2323
import com.google.common.collect.ImmutableList;
2424
import com.google.common.net.UrlEscapers;
25+
import java.security.KeyStore;
2526
import java.util.Arrays;
2627
import java.util.Collections;
2728
import java.util.HashMap;
@@ -173,6 +174,8 @@ protected boolean removeEldestEntry(Map.Entry<String, Map<String, String>> eldes
173174
static final String REQUEST_GOOGLE_DRIVE_SCOPE_PROPERTY_NAME = "RequestGoogleDriveScope";
174175
static final String SSL_TRUST_STORE_PROPERTY_NAME = "SSLTrustStore";
175176
static final String SSL_TRUST_STORE_PWD_PROPERTY_NAME = "SSLTrustStorePwd";
177+
static final String SSL_TRUST_STORE_TYPE_PROPERTY_NAME = "SSLTrustStoreType";
178+
static final String SSL_TRUST_STORE_PROVIDER_PROPERTY_NAME = "SSLTrustStoreProvider";
176179
static final int DEFAULT_REQUEST_GOOGLE_DRIVE_SCOPE_VALUE = 0;
177180
static final String MAX_BYTES_BILLED_PROPERTY_NAME = "MaximumBytesBilled";
178181
static final Long DEFAULT_MAX_BYTES_BILLED_VALUE = 0L;
@@ -607,6 +610,17 @@ protected boolean removeEldestEntry(Map.Entry<String, Map<String, String>> eldes
607610
"The password for accessing the Java TrustStore that is specified using"
608611
+ " the property SSLTrustStore.")
609612
.build(),
613+
BigQueryConnectionProperty.newBuilder()
614+
.setName(SSL_TRUST_STORE_TYPE_PROPERTY_NAME)
615+
.setDescription(
616+
"The type of the Java TrustStore specified using the property SSLTrustStore.")
617+
.setLazyDefaultValue(KeyStore::getDefaultType)
618+
.build(),
619+
BigQueryConnectionProperty.newBuilder()
620+
.setName(SSL_TRUST_STORE_PROVIDER_PROPERTY_NAME)
621+
.setDescription(
622+
"The security provider of the Java TrustStore specified using the property SSLTrustStore.")
623+
.build(),
610624
BigQueryConnectionProperty.newBuilder()
611625
.setName(HTTP_CONNECT_TIMEOUT_PROPERTY_NAME)
612626
.setDescription(

java-bigquery-jdbc/src/main/java/com/google/cloud/bigquery/jdbc/DataSource.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ public class DataSource implements javax.sql.DataSource {
8989
private Integer metadataFetchThreadCount;
9090
private String sslTrustStorePath;
9191
private String sslTrustStorePassword;
92+
private String sslTrustStoreType;
93+
private String sslTrustStoreProvider;
9294
private Map<String, String> labels;
9395
private String requestReason;
9496
private Integer timeout;
@@ -261,6 +263,12 @@ public class DataSource implements javax.sql.DataSource {
261263
.put(
262264
BigQueryJdbcUrlUtility.SSL_TRUST_STORE_PWD_PROPERTY_NAME,
263265
DataSource::setSSLTrustStorePassword)
266+
.put(
267+
BigQueryJdbcUrlUtility.SSL_TRUST_STORE_TYPE_PROPERTY_NAME,
268+
DataSource::setSSLTrustStoreType)
269+
.put(
270+
BigQueryJdbcUrlUtility.SSL_TRUST_STORE_PROVIDER_PROPERTY_NAME,
271+
DataSource::setSSLTrustStoreProvider)
264272
.put(
265273
BigQueryJdbcUrlUtility.LABELS_PROPERTY_NAME,
266274
(ds, val) ->
@@ -588,6 +596,15 @@ Properties createProperties() {
588596
BigQueryJdbcUrlUtility.SSL_TRUST_STORE_PWD_PROPERTY_NAME,
589597
String.valueOf(this.sslTrustStorePassword));
590598
}
599+
if (this.sslTrustStoreType != null) {
600+
connectionProperties.setProperty(
601+
BigQueryJdbcUrlUtility.SSL_TRUST_STORE_TYPE_PROPERTY_NAME, this.sslTrustStoreType);
602+
}
603+
if (this.sslTrustStoreProvider != null) {
604+
connectionProperties.setProperty(
605+
BigQueryJdbcUrlUtility.SSL_TRUST_STORE_PROVIDER_PROPERTY_NAME,
606+
this.sslTrustStoreProvider);
607+
}
591608
if (this.labels != null) {
592609
connectionProperties.setProperty(
593610
BigQueryJdbcUrlUtility.LABELS_PROPERTY_NAME, serializeMap(this.labels));
@@ -1124,6 +1141,22 @@ public void setSSLTrustStorePassword(String sslTrustStorePassword) {
11241141
this.sslTrustStorePassword = sslTrustStorePassword;
11251142
}
11261143

1144+
public String getSSLTrustStoreType() {
1145+
return sslTrustStoreType;
1146+
}
1147+
1148+
public void setSSLTrustStoreType(String sslTrustStoreType) {
1149+
this.sslTrustStoreType = sslTrustStoreType;
1150+
}
1151+
1152+
public String getSSLTrustStoreProvider() {
1153+
return sslTrustStoreProvider;
1154+
}
1155+
1156+
public void setSSLTrustStoreProvider(String sslTrustStoreProvider) {
1157+
this.sslTrustStoreProvider = sslTrustStoreProvider;
1158+
}
1159+
11271160
public Map<String, String> getLabels() {
11281161
return labels;
11291162
}

0 commit comments

Comments
 (0)