Skip to content

Commit 12b81d7

Browse files
Merge pull request #3088 from Amila-Rukshan/enforcer-ca-truststore
Enforcer truststore should trust ca root certs
2 parents 06336f0 + c4c6dae commit 12b81d7

File tree

2 files changed

+56
-2
lines changed

2 files changed

+56
-2
lines changed

enforcer-parent/enforcer/src/main/java/org/wso2/choreo/connect/enforcer/config/ConfigHolder.java

+47-2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
package org.wso2.choreo.connect.enforcer.config;
2020

21+
import org.apache.commons.lang3.RandomStringUtils;
2122
import org.apache.commons.lang3.StringUtils;
2223
import org.apache.logging.log4j.LogManager;
2324
import org.apache.logging.log4j.Logger;
@@ -80,14 +81,17 @@
8081
import java.security.NoSuchAlgorithmException;
8182
import java.security.cert.Certificate;
8283
import java.security.cert.CertificateException;
84+
import java.security.cert.X509Certificate;
8385
import java.util.ArrayList;
8486
import java.util.Arrays;
8587
import java.util.List;
8688
import java.util.Map;
8789
import java.util.regex.Matcher;
8890
import java.util.regex.Pattern;
8991

92+
import javax.net.ssl.TrustManager;
9093
import javax.net.ssl.TrustManagerFactory;
94+
import javax.net.ssl.X509TrustManager;
9195

9296
/**
9397
* Configuration holder class for Microgateway.
@@ -376,17 +380,58 @@ private void populateTMBinaryConfig(BinaryPublisher binary) {
376380

377381
private void loadTrustStore() {
378382
try {
383+
379384
trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
380385
trustStore.load(null);
381-
String truststoreFilePath = getEnvVarConfig().getTrustedAdapterCertsPath();
382-
TLSUtils.addCertsToTruststore(trustStore, truststoreFilePath);
386+
387+
if (getEnvVarConfig().isTrustDefaultCerts()) {
388+
loadDefaultCertsToTrustStore();
389+
}
390+
loadTrustedCertsToTrustStore();
391+
383392
trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
384393
trustManagerFactory.init(trustStore);
394+
385395
} catch (KeyStoreException | CertificateException | NoSuchAlgorithmException | IOException e) {
386396
logger.error("Error in loading certs to the trust store.", e);
387397
}
388398
}
389399

400+
private void loadTrustedCertsToTrustStore() throws IOException {
401+
String truststoreFilePath = getEnvVarConfig().getTrustedAdapterCertsPath();
402+
TLSUtils.addCertsToTruststore(trustStore, truststoreFilePath);
403+
}
404+
405+
private void loadDefaultCertsToTrustStore() throws NoSuchAlgorithmException, KeyStoreException {
406+
TrustManagerFactory tmf = TrustManagerFactory
407+
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
408+
// Using null here initialises the TMF with the default trust store.
409+
tmf.init((KeyStore) null);
410+
411+
// Get hold of the default trust manager
412+
X509TrustManager defaultTm = null;
413+
for (TrustManager tm : tmf.getTrustManagers()) {
414+
if (tm instanceof X509TrustManager) {
415+
defaultTm = (X509TrustManager) tm;
416+
break;
417+
}
418+
}
419+
420+
// Get the certs from defaultTm and add them to our trustStore
421+
if (defaultTm != null) {
422+
X509Certificate[] trustedCerts = defaultTm.getAcceptedIssuers();
423+
Arrays.stream(trustedCerts)
424+
.forEach(cert -> {
425+
try {
426+
trustStore.setCertificateEntry(RandomStringUtils.random(10, true, false),
427+
cert);
428+
} catch (KeyStoreException e) {
429+
logger.error("Error while adding default trusted ca cert", e);
430+
}
431+
});
432+
}
433+
}
434+
390435
private void loadOpaClientKeyStore() {
391436
String certPath = getEnvVarConfig().getOpaClientPublicKeyPath();
392437
String keyPath = getEnvVarConfig().getOpaClientPrivateKeyPath();

enforcer-parent/enforcer/src/main/java/org/wso2/choreo/connect/enforcer/config/EnvVarConfig.java

+9
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
*/
2727
public class EnvVarConfig {
2828
private static final String TRUSTED_CA_CERTS_PATH = "TRUSTED_CA_CERTS_PATH";
29+
private static final String TRUST_DEFAULT_CERTS = "TRUST_DEFAULT_CERTS";
2930
private static final String ADAPTER_HOST_NAME = "ADAPTER_HOST_NAME";
3031
private static final String ENFORCER_PRIVATE_KEY_PATH = "ENFORCER_PRIVATE_KEY_PATH";
3132
private static final String ENFORCER_PUBLIC_CERT_PATH = "ENFORCER_PUBLIC_CERT_PATH";
@@ -42,6 +43,7 @@ public class EnvVarConfig {
4243

4344
// Since the container is running in linux container, path separator is not needed.
4445
private static final String DEFAULT_TRUSTED_CA_CERTS_PATH = "/home/wso2/security/truststore";
46+
private static final String DEFAULT_TRUST_DEFAULT_CERTS = "true";
4547
private static final String DEFAULT_ADAPTER_HOST_NAME = "adapter";
4648
private static final String DEFAULT_ENFORCER_PRIVATE_KEY_PATH = "/home/wso2/security/keystore/mg.key";
4749
private static final String DEFAULT_ENFORCER_PUBLIC_CERT_PATH = "/home/wso2/security/keystore/mg.pem";
@@ -56,6 +58,7 @@ public class EnvVarConfig {
5658

5759
private static EnvVarConfig instance;
5860
private final String trustedAdapterCertsPath;
61+
private final String trustDefaultCerts;
5962
private final String enforcerPrivateKeyPath;
6063
private final String enforcerPublicKeyPath;
6164
private final String opaClientPrivateKeyPath;
@@ -75,6 +78,8 @@ public class EnvVarConfig {
7578
private EnvVarConfig() {
7679
trustedAdapterCertsPath = retrieveEnvVarOrDefault(TRUSTED_CA_CERTS_PATH,
7780
DEFAULT_TRUSTED_CA_CERTS_PATH);
81+
trustDefaultCerts = retrieveEnvVarOrDefault(TRUST_DEFAULT_CERTS,
82+
DEFAULT_TRUST_DEFAULT_CERTS);
7883
enforcerPrivateKeyPath = retrieveEnvVarOrDefault(ENFORCER_PRIVATE_KEY_PATH,
7984
DEFAULT_ENFORCER_PRIVATE_KEY_PATH);
8085
enforcerPublicKeyPath = retrieveEnvVarOrDefault(ENFORCER_PUBLIC_CERT_PATH,
@@ -119,6 +124,10 @@ public String getTrustedAdapterCertsPath() {
119124
return trustedAdapterCertsPath;
120125
}
121126

127+
public boolean isTrustDefaultCerts() {
128+
return Boolean.valueOf(trustDefaultCerts);
129+
}
130+
122131
public String getEnforcerPrivateKeyPath() {
123132
return enforcerPrivateKeyPath;
124133
}

0 commit comments

Comments
 (0)