Skip to content

Commit e3d0d8d

Browse files
authored
fix for registration conflicts with BouncyCastleProvider (#864)
1 parent ba4c0dc commit e3d0d8d

2 files changed

Lines changed: 9 additions & 13 deletions

File tree

NEXT_CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
-
1010

1111
### Fixed
12-
-
12+
- Fixed Bouncy Castle registration conflicts by using local provider instance instead of global security registration.
1313

1414
---
1515
*Note: When making changes, please add your change under the appropriate section with a brief description.*

src/main/java/com/databricks/jdbc/auth/JwtPrivateKeyClientCredentials.java

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import java.net.URISyntaxException;
2626
import java.nio.charset.StandardCharsets;
2727
import java.security.PrivateKey;
28-
import java.security.Security;
2928
import java.security.interfaces.ECPrivateKey;
3029
import java.security.interfaces.RSAPrivateKey;
3130
import java.sql.Timestamp;
@@ -118,7 +117,8 @@ public JwtPrivateKeyClientCredentials build() {
118117
}
119118
}
120119

121-
private final String BOUNCY_CASTLE_PROVIDER = "BC";
120+
private static final BouncyCastleProvider bouncyCastleProvider = new BouncyCastleProvider();
121+
122122
private IDatabricksHttpClient hc;
123123
private String clientId;
124124
private String tokenUrl;
@@ -235,13 +235,10 @@ JWSAlgorithm determineSignatureAlgorithm(String jwtAlgorithm) {
235235
}
236236

237237
private PrivateKey getPrivateKey() {
238-
try {
239-
Security.addProvider(new BouncyCastleProvider());
240-
try (Reader reader = new FileReader(jwtKeyFile);
241-
PEMParser pemParser = new PEMParser(reader)) {
242-
Object object = pemParser.readObject();
243-
return convertPrivateKey(object);
244-
}
238+
try (Reader reader = new FileReader(jwtKeyFile);
239+
PEMParser pemParser = new PEMParser(reader)) {
240+
Object object = pemParser.readObject();
241+
return convertPrivateKey(object);
245242
} catch (DatabricksSQLException | IOException e) {
246243
String errorMessage = "Failed to parse private key: " + e.getMessage();
247244
LOGGER.error(errorMessage);
@@ -257,7 +254,7 @@ PrivateKey convertPrivateKey(Object pemObject) throws DatabricksParsingException
257254
PKCS8EncryptedPrivateKeyInfo encryptedKeyInfo = (PKCS8EncryptedPrivateKeyInfo) pemObject;
258255
JceOpenSSLPKCS8DecryptorProviderBuilder decryptorProviderBuilder =
259256
new JceOpenSSLPKCS8DecryptorProviderBuilder();
260-
decryptorProviderBuilder.setProvider(BOUNCY_CASTLE_PROVIDER);
257+
decryptorProviderBuilder.setProvider(bouncyCastleProvider);
261258
InputDecryptorProvider decryptorProvider =
262259
decryptorProviderBuilder.build(jwtKeyPassphrase.toCharArray());
263260
privateKeyInfo = encryptedKeyInfo.decryptPrivateKeyInfo(decryptorProvider);
@@ -269,8 +266,7 @@ PrivateKey convertPrivateKey(Object pemObject) throws DatabricksParsingException
269266
privateKeyInfo = (PrivateKeyInfo) pemObject;
270267
}
271268
}
272-
JcaPEMKeyConverter keyConverter =
273-
new JcaPEMKeyConverter().setProvider(BOUNCY_CASTLE_PROVIDER);
269+
JcaPEMKeyConverter keyConverter = new JcaPEMKeyConverter().setProvider(bouncyCastleProvider);
274270
return keyConverter.getPrivateKey(privateKeyInfo);
275271
} catch (OperatorCreationException | PKCSException | PEMException e) {
276272
String errorMessage = "Cannot decrypt private JWT key " + e.getMessage();

0 commit comments

Comments
 (0)