Skip to content

Commit 3cbc0b0

Browse files
committed
allow to set SSL provider name -> just in case user has it installed
1 parent 480832b commit 3cbc0b0

File tree

1 file changed

+27
-11
lines changed

1 file changed

+27
-11
lines changed

src/main/java/org/jruby/ext/openssl/SecurityHelper.java

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
*/
2424
package org.jruby.ext.openssl;
2525

26+
import static org.jruby.ext.openssl.OpenSSL.debug;
2627
import static org.jruby.ext.openssl.OpenSSL.debugStackTrace;
2728

2829
import java.io.IOException;
@@ -103,10 +104,10 @@ public abstract class SecurityHelper {
103104
static boolean setBouncyCastleProvider = true; // (package access for tests)
104105
static volatile Provider securityProvider; // 'BC' provider (package access for tests)
105106
private static volatile Boolean registerProvider = null;
106-
static final Map<String, Class> implEngines = new ConcurrentHashMap<String, Class>(16, 0.75f, 1);
107+
static final Map<String, Class> implEngines = new ConcurrentHashMap<>(16, 0.75f, 1);
107108

108109
private static String BCJSSE_PROVIDER_CLASS = "org.bouncycastle.jsse.provider.BouncyCastleJsseProvider";
109-
static boolean setJsseBouncyCastleProvider = true;
110+
static boolean setJsseProvider = true;
110111
static volatile Provider jsseProvider;
111112

112113
/**
@@ -146,14 +147,22 @@ public static Provider getSecurityProvider() {
146147
return provider;
147148
}
148149

149-
static Provider getJsseProvider() {
150+
private static Provider getJsseProvider(final String name) {
150151
Provider provider = jsseProvider;
151-
if ( setJsseBouncyCastleProvider && provider == null ) {
152+
if ( setJsseProvider && provider == null ) {
152153
synchronized(SecurityHelper.class) {
153154
provider = jsseProvider;
154-
if ( setJsseBouncyCastleProvider && provider == null ) {
155-
provider = jsseProvider = newBouncyCastleProvider(BCJSSE_PROVIDER_CLASS);
156-
setJsseBouncyCastleProvider = false;
155+
if ( setJsseProvider && provider == null ) {
156+
try {
157+
provider = Security.getProvider(name);
158+
}
159+
catch (Exception ex) {
160+
debug("failed to get provider: " + name, ex);
161+
}
162+
if (provider == null && "BCJSSE".equals(name)) {
163+
provider = newBouncyCastleProvider(BCJSSE_PROVIDER_CLASS);
164+
}
165+
jsseProvider = provider; setJsseProvider = false;
157166
}
158167
}
159168
}
@@ -649,16 +658,23 @@ static SecretKeyFactory getSecretKeyFactory(final String algorithm, final Provid
649658
);
650659
}
651660

652-
private static final boolean providerSSLContext; // NOTE: experimental support for using BCJSSE
661+
private static final String providerSSLContext; // NOTE: experimental support for using BCJSSE
653662
static {
654-
providerSSLContext = SafePropertyAccessor.getBoolean("jruby.openssl.ssl.provider");
663+
String providerSSL = SafePropertyAccessor.getProperty("jruby.openssl.ssl.provider", "");
664+
switch (providerSSL.trim()) {
665+
case "BC": case "true":
666+
providerSSL = "BCJSSE"; break;
667+
case "": case "false":
668+
providerSSL = null; break;
669+
}
670+
providerSSLContext = providerSSL;
655671
}
656672

657673
public static SSLContext getSSLContext(final String protocol)
658674
throws NoSuchAlgorithmException {
659675
try {
660-
if ( providerSSLContext && ! "SSL".equals(protocol) ) { // only TLS supported in BCJSSE
661-
final Provider provider = getJsseProvider();
676+
if ( providerSSLContext != null && ! "SSL".equals(protocol) ) { // only TLS supported in BCJSSE
677+
final Provider provider = getJsseProvider(providerSSLContext);
662678
if ( provider != null ) {
663679
return getSSLContext(protocol, provider);
664680
}

0 commit comments

Comments
 (0)