From 3c6b33123d0cef28df129ab563a2edb87d01ab63 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Mon, 4 Feb 2019 20:43:16 +0530 Subject: [PATCH 1/3] Fix #1314: Support for EC Private Keys --- CHANGELOG.md | 2 + kubernetes-client/pom.xml | 11 +++++ .../io/fabric8/kubernetes/client/Config.java | 41 ++++++++++++++++- .../kubernetes/client/internal/CertUtils.java | 44 +++++++++++++------ .../client/internal/CertUtilsTest.java | 11 +++++ .../src/test/resources/ssl/fabric8-ec.cert | 18 ++++++++ .../src/test/resources/ssl/fabric8-ec.key | 5 +++ .../features/src/main/resources/feature.xml | 2 + pom.xml | 12 ++++- 9 files changed, 128 insertions(+), 18 deletions(-) create mode 100644 kubernetes-client/src/test/resources/ssl/fabric8-ec.cert create mode 100644 kubernetes-client/src/test/resources/ssl/fabric8-ec.key diff --git a/CHANGELOG.md b/CHANGELOG.md index c060994b5c1..2a9576036df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -79,6 +79,8 @@ * Fix #1339: oAuth token rotation support + * Fix #1314: Support for EC Private Keys + Misc * Appended some files to licence check exclusion list. diff --git a/kubernetes-client/pom.xml b/kubernetes-client/pom.xml index 04e98231338..6c930740f84 100644 --- a/kubernetes-client/pom.xml +++ b/kubernetes-client/pom.xml @@ -201,6 +201,17 @@ ${zjsonpatch.version} + + org.bouncycastle + bcprov-ext-jdk15on + ${bouncycastle.version} + + + org.bouncycastle + bcpkix-jdk15on + ${bouncycastle.version} + + com.github.mifmif generex diff --git a/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/Config.java b/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/Config.java index 2bd97c5e41f..dc023b3054e 100644 --- a/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/Config.java +++ b/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/Config.java @@ -26,6 +26,7 @@ import io.fabric8.kubernetes.api.model.Context; import io.fabric8.kubernetes.api.model.ExecConfig; import io.fabric8.kubernetes.api.model.ExecEnvVar; +import io.fabric8.kubernetes.client.internal.CertUtils; import io.fabric8.kubernetes.client.internal.KubeConfigUtils; import io.fabric8.kubernetes.client.internal.SSLUtils; import io.fabric8.kubernetes.client.utils.IOHelpers; @@ -36,8 +37,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.BufferedReader; import java.io.File; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; @@ -284,7 +288,7 @@ public static void configFromSysPropsOrEnvVars(Config config) { config.setClientCertData(Utils.getSystemPropertyOrEnvVar(KUBERNETES_CLIENT_CERTIFICATE_DATA_SYSTEM_PROPERTY, config.getClientCertData())); config.setClientKeyFile(Utils.getSystemPropertyOrEnvVar(KUBERNETES_CLIENT_KEY_FILE_SYSTEM_PROPERTY, config.getClientKeyFile())); config.setClientKeyData(Utils.getSystemPropertyOrEnvVar(KUBERNETES_CLIENT_KEY_DATA_SYSTEM_PROPERTY, config.getClientKeyData())); - config.setClientKeyAlgo(Utils.getSystemPropertyOrEnvVar(KUBERNETES_CLIENT_KEY_ALGO_SYSTEM_PROPERTY, config.getClientKeyAlgo())); + config.setClientKeyAlgo(getKeyAlgorithm(config.getClientKeyFile(), config.getClientKeyData())); config.setClientKeyPassphrase(Utils.getSystemPropertyOrEnvVar(KUBERNETES_CLIENT_KEY_PASSPHRASE_SYSTEM_PROPERTY, new String(config.getClientKeyPassphrase()))); config.setUserAgent(Utils.getSystemPropertyOrEnvVar(KUBERNETES_USER_AGENT, config.getUserAgent())); @@ -431,7 +435,7 @@ private static String absolutify(File relativeTo, String filename) { return new File(relativeTo.getParentFile(), filename).getAbsolutePath(); } - public static Config fromKubeconfig(String kubeconfigContents) { + public static Config fromKubeconfig(String kubeconfigContents) throws IOException { return fromKubeconfig(null, kubeconfigContents, null); } @@ -638,6 +642,39 @@ private static String getHomeDir() { return System.getProperty("user.home", "."); } + public static String getKeyAlgorithm(InputStream inputStream) throws IOException { + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + String line, algorithm = null; + + while ((line = bufferedReader.readLine()) != null) { + if (line.contains("BEGIN EC PRIVATE KEY")) + algorithm = "EC"; + else if (line.contains("BEGIN RSA PRIVATE KEY")) { + algorithm = "RSA"; + } + } + //bufferedReader.close(); + return algorithm; + } + + public static String getKeyAlgorithm(String clientKeyFile, String clientKeyData) { + // Check if any system property is set + if(Utils.getSystemPropertyOrEnvVar(KUBERNETES_CLIENT_KEY_ALGO_SYSTEM_PROPERTY) != null) { + return Utils.getSystemPropertyOrEnvVar(KUBERNETES_CLIENT_KEY_ALGO_SYSTEM_PROPERTY); + } + + // Detect algorithm + try { + InputStream keyInputStream = CertUtils.getInputStreamFromDataOrFile(clientKeyFile, clientKeyData); + if(keyInputStream != null) { + return getKeyAlgorithm(keyInputStream); + } + } catch(IOException exception) { + LOGGER.error("Failure in determining private key type: ", exception.getMessage()); + } + return null; + } + @JsonProperty("oauthToken") public String getOauthToken() { return getRequestConfig().getOauthToken(); diff --git a/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/internal/CertUtils.java b/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/internal/CertUtils.java index 531919eb4b1..150ab3cc89a 100644 --- a/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/internal/CertUtils.java +++ b/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/internal/CertUtils.java @@ -30,6 +30,7 @@ import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; +import java.security.Security; import java.security.cert.Certificate; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; @@ -38,6 +39,9 @@ import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.RSAPrivateCrtKeySpec; import okio.ByteString; +import org.bouncycastle.openssl.PEMKeyPair; +import org.bouncycastle.openssl.PEMParser; +import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -102,20 +106,7 @@ public static KeyStore createTrustStore(InputStream pemInputStream, String trust public static KeyStore createKeyStore(InputStream certInputStream, InputStream keyInputStream, String clientKeyAlgo, char[] clientKeyPassphrase, String keyStoreFile, char[] keyStorePassphrase) throws IOException, CertificateException, NoSuchAlgorithmException, InvalidKeySpecException, KeyStoreException { CertificateFactory certFactory = CertificateFactory.getInstance("X509"); X509Certificate cert = (X509Certificate) certFactory.generateCertificate(certInputStream); - - byte[] keyBytes = decodePem(keyInputStream); - - PrivateKey privateKey; - - KeyFactory keyFactory = KeyFactory.getInstance(clientKeyAlgo); - try { - // First let's try PKCS8 - privateKey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(keyBytes)); - } catch (InvalidKeySpecException e) { - // Otherwise try PKCS8 - RSAPrivateCrtKeySpec keySpec = PKCS1Util.decodePKCS1(keyBytes); - privateKey = keyFactory.generatePrivate(keySpec); - } + PrivateKey privateKey = loadKey(keyInputStream, clientKeyAlgo); KeyStore keyStore = KeyStore.getInstance("JKS"); if (Utils.isNotNullOrEmpty(keyStoreFile)){ @@ -130,6 +121,31 @@ public static KeyStore createKeyStore(InputStream certInputStream, InputStream k return keyStore; } + private static PrivateKey loadKey(InputStream keyInputStream, String clientKeyAlgo) throws IOException, InvalidKeySpecException, NoSuchAlgorithmException { + if(clientKeyAlgo == null) { + clientKeyAlgo = "RSA"; // by default let's assume it's RSA + } + if(clientKeyAlgo.equals("EC")) { + Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); + PEMKeyPair keys = (PEMKeyPair) new PEMParser(new InputStreamReader(keyInputStream)).readObject(); + return new JcaPEMKeyConverter().getKeyPair(keys).getPrivate(); + } + + byte[] keyBytes = decodePem(keyInputStream); + if(clientKeyAlgo.equals("RSA")) { + KeyFactory keyFactory = KeyFactory.getInstance(clientKeyAlgo); + try { + // First let's try PKCS8 + return keyFactory.generatePrivate(new PKCS8EncodedKeySpec(keyBytes)); + } catch (InvalidKeySpecException e) { + // Otherwise try PKCS8 + RSAPrivateCrtKeySpec keySpec = PKCS1Util.decodePKCS1(keyBytes); + return keyFactory.generatePrivate(keySpec); + } + } + throw new InvalidKeySpecException("Unknown type of PKCS8 Private Key, tried RSA and ECDSA"); + } + private static void loadDefaultTrustStoreFile(KeyStore keyStore, char[] trustStorePassphrase) throws CertificateException, NoSuchAlgorithmException, IOException { diff --git a/kubernetes-client/src/test/java/io/fabric8/kubernetes/client/internal/CertUtilsTest.java b/kubernetes-client/src/test/java/io/fabric8/kubernetes/client/internal/CertUtilsTest.java index 3aefce22fed..675ad48d039 100644 --- a/kubernetes-client/src/test/java/io/fabric8/kubernetes/client/internal/CertUtilsTest.java +++ b/kubernetes-client/src/test/java/io/fabric8/kubernetes/client/internal/CertUtilsTest.java @@ -140,6 +140,17 @@ public void testLoadKeyStoreFromFileUsingSystemProperties() verifyFabric8InStore(trustStore); } + @Test + public void testECKeyLoad() throws InvalidKeySpecException, CertificateException, NoSuchAlgorithmException, KeyStoreException, IOException { + String privateKeyPath = Utils.filePath(getClass().getResource("/ssl/fabric8-ec.key")); + String certPath = Utils.filePath(getClass().getResource("/ssl/fabric8-ec.cert")); + + KeyStore trustStore = + CertUtils.createKeyStore(null, certPath, null, privateKeyPath, "EC", "foo", null, null); + + assertEquals(1, trustStore.size()); + } + private void verifyFabric8InStore(KeyStore trustStore) throws KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException { diff --git a/kubernetes-client/src/test/resources/ssl/fabric8-ec.cert b/kubernetes-client/src/test/resources/ssl/fabric8-ec.cert new file mode 100644 index 00000000000..43c17dfea0a --- /dev/null +++ b/kubernetes-client/src/test/resources/ssl/fabric8-ec.cert @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE----- +MIIC7TCCAdWgAwIBAgIUD0Q+lZUpqmvTUxmCbhsPx93hYI4wDQYJKoZIhvcNAQEL +BQAwczELMAkGA1UEBhMCVVMxFjAUBgNVBAgTDVNhbiBGcmFuY2lzY28xCzAJBgNV +BAcTAkNBMRgwFgYDVQQKEw9NeSBDb21wYW55IE5hbWUxEzARBgNVBAsTCk9yZyBV +bml0IDIxEDAOBgNVBAMTB0t1YmUgQ0EwHhcNMTgwMjEzMDc1MzAwWhcNMjMwMjEy +MDc1MzAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UECBMNU2FuIEZyYW5jaXNjbzEL +MAkGA1UEBxMCQ0ExDjAMBgNVBAMTBWFkbWluMFkwEwYHKoZIzj0CAQYIKoZIzj0D +AQcDQgAEUHBg7OvKkSprAljQcCcpXFns/pMNDkQJZuooj97A0063ipBrZzbdxTcu +VcBjFNJC/Tn2keNSQP+m9QbQmQfmM6N1MHMwDgYDVR0PAQH/BAQDAgWgMBMGA1Ud +JQQMMAoGCCsGAQUFBwMCMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFMBq0KJaRKoC ++a8R5la/B8tJahD3MB8GA1UdIwQYMBaAFOuZHF+ex0WLX3UX9LJoFHbI9cPNMA0G +CSqGSIb3DQEBCwUAA4IBAQC47D3zYMTg/C9gOYu20xEmw6eTEhJ1wWG9jSdHM9G8 +0F3mD4+bG3skx5kaCgtJ3KqbMSGPJ234Ju9VHCNiyiasZS41a8wuagJ6v5pTItLL +BmQ3OhT2HJZz+lDbsb3jLDzesQ5UCct08/e8ST4hnZUcSrz2geD1hSYQEhadsI87 +A+wVAvGfhCyiDUiClA2vwosWfomshkWphRzy+s5zFLuxlBAxj8g2oAbCJfhfJS5A +O8W5Nu+ddO5+7PB+y28Bue1GWABIjytmyLdvic0vkKzZkSzPOwqCT1ofZ9HU56h7 +jKOjtBacCcl/7pLgvaA8Ng1qfjQTiveDVfI8rNWiEhRm +-----END CERTIFICATE----- diff --git a/kubernetes-client/src/test/resources/ssl/fabric8-ec.key b/kubernetes-client/src/test/resources/ssl/fabric8-ec.key new file mode 100644 index 00000000000..f375231bb44 --- /dev/null +++ b/kubernetes-client/src/test/resources/ssl/fabric8-ec.key @@ -0,0 +1,5 @@ +-----BEGIN EC PRIVATE KEY----- +MHcCAQEEIAPhomYs9rdnNgEtr2FIB1rBDYnuKqV4QVAYBX4yRqAEoAoGCCqGSM49 +AwEHoUQDQgAEUHBg7OvKkSprAljQcCcpXFns/pMNDkQJZuooj97A0063ipBrZzbd +xTcuVcBjFNJC/Tn2keNSQP+m9QbQmQfmMw== +-----END EC PRIVATE KEY----- diff --git a/platforms/karaf/features/src/main/resources/feature.xml b/platforms/karaf/features/src/main/resources/feature.xml index 43888621595..a672e7c6940 100644 --- a/platforms/karaf/features/src/main/resources/feature.xml +++ b/platforms/karaf/features/src/main/resources/feature.xml @@ -25,6 +25,8 @@ mvn:com.fasterxml.jackson.core/jackson-databind/${jackson.bundle.version} mvn:com.fasterxml.jackson.dataformat/jackson-dataformat-yaml/${jackson.bundle.version} mvn:org.yaml/snakeyaml/${snakeyaml.version} + mvn:org.bouncycastle/bcprov-ext-jdk15on/${bouncycastle.version} + mvn:org.bouncycastle/bcpkix-jdk15on/${bouncycastle.version} mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.generex/${generex.bundle.version} mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.automaton/${automaton.bundle.version} mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.conscrypt-openjdk/${conscrypt-openjdk-uber.bundle.version} diff --git a/pom.xml b/pom.xml index 4be5a6a49b7..dba8c990330 100644 --- a/pom.xml +++ b/pom.xml @@ -100,10 +100,18 @@ 3.12.1 1.2.0.Final 3.1.3 - 1.7.26 1.24 - + 1.59 + 1.9.12 + 0.14.6 + 1.1.0.Final + 2.5.4 + 1.10 + 3.0.1 + 3.0.1 + 3.0.0-M1 + 1.22.0 1.12.0 0.16.5 2.0.1.Final From cfcf6d7765d67069dab11bfe076c83731a795298 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Thu, 14 Mar 2019 19:54:56 +0530 Subject: [PATCH 2/3] Make bouncycastle dependency optional in kubernetes-client.jar + Added true in bouncycastle dependency in kubernetes client module + Handle NoClassDefFoundError in CertUtils --- kubernetes-client/pom.xml | 2 + .../io/fabric8/kubernetes/client/Config.java | 6 ++- .../kubernetes/client/internal/CertUtils.java | 38 +++++++++++-------- kubernetes-server-mock/pom.xml | 11 ++++++ kubernetes-tests/pom.xml | 11 ++++++ openshift-client/pom.xml | 10 +++++ 6 files changed, 61 insertions(+), 17 deletions(-) diff --git a/kubernetes-client/pom.xml b/kubernetes-client/pom.xml index 6c930740f84..cf7ba66850a 100644 --- a/kubernetes-client/pom.xml +++ b/kubernetes-client/pom.xml @@ -204,10 +204,12 @@ org.bouncycastle bcprov-ext-jdk15on + true ${bouncycastle.version} org.bouncycastle + true bcpkix-jdk15on ${bouncycastle.version} diff --git a/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/Config.java b/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/Config.java index dc023b3054e..26dfa203804 100644 --- a/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/Config.java +++ b/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/Config.java @@ -653,7 +653,6 @@ else if (line.contains("BEGIN RSA PRIVATE KEY")) { algorithm = "RSA"; } } - //bufferedReader.close(); return algorithm; } @@ -670,7 +669,10 @@ public static String getKeyAlgorithm(String clientKeyFile, String clientKeyData) return getKeyAlgorithm(keyInputStream); } } catch(IOException exception) { - LOGGER.error("Failure in determining private key type: ", exception.getMessage()); + LOGGER.info("Failure in determining private key algorithm type, defaulting to RSA ", exception.getMessage()); + } catch(NoClassDefFoundError noClassDefFoundError) { + throw new IllegalStateException("Please make sure org.bouncycastle:bcprov-ext-jdk15on " + + "and org.bouncycastle:bcpkix-jdk15on are included in your project's classpath. ", noClassDefFoundError); } return null; } diff --git a/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/internal/CertUtils.java b/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/internal/CertUtils.java index 150ab3cc89a..492260fd1a9 100644 --- a/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/internal/CertUtils.java +++ b/kubernetes-client/src/main/java/io/fabric8/kubernetes/client/internal/CertUtils.java @@ -126,26 +126,34 @@ private static PrivateKey loadKey(InputStream keyInputStream, String clientKeyAl clientKeyAlgo = "RSA"; // by default let's assume it's RSA } if(clientKeyAlgo.equals("EC")) { - Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); - PEMKeyPair keys = (PEMKeyPair) new PEMParser(new InputStreamReader(keyInputStream)).readObject(); - return new JcaPEMKeyConverter().getKeyPair(keys).getPrivate(); + return handleECKey(keyInputStream); + } else if(clientKeyAlgo.equals("RSA")) { + return handleOtherKeys(keyInputStream, clientKeyAlgo); } - byte[] keyBytes = decodePem(keyInputStream); - if(clientKeyAlgo.equals("RSA")) { - KeyFactory keyFactory = KeyFactory.getInstance(clientKeyAlgo); - try { - // First let's try PKCS8 - return keyFactory.generatePrivate(new PKCS8EncodedKeySpec(keyBytes)); - } catch (InvalidKeySpecException e) { - // Otherwise try PKCS8 - RSAPrivateCrtKeySpec keySpec = PKCS1Util.decodePKCS1(keyBytes); - return keyFactory.generatePrivate(keySpec); - } - } throw new InvalidKeySpecException("Unknown type of PKCS8 Private Key, tried RSA and ECDSA"); } + private static PrivateKey handleECKey(InputStream keyInputStream) throws IOException { + Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); + PEMKeyPair keys = (PEMKeyPair) new PEMParser(new InputStreamReader(keyInputStream)).readObject(); + return new JcaPEMKeyConverter().getKeyPair(keys).getPrivate(); + } + + private static PrivateKey handleOtherKeys(InputStream keyInputStream, String clientKeyAlgo) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException { + byte[] keyBytes = decodePem(keyInputStream); + KeyFactory keyFactory = KeyFactory.getInstance(clientKeyAlgo); + try { + // First let's try PKCS8 + return keyFactory.generatePrivate(new PKCS8EncodedKeySpec(keyBytes)); + } catch (InvalidKeySpecException e) { + // Otherwise try PKCS8 + RSAPrivateCrtKeySpec keySpec = PKCS1Util.decodePKCS1(keyBytes); + return keyFactory.generatePrivate(keySpec); + } + } + + private static void loadDefaultTrustStoreFile(KeyStore keyStore, char[] trustStorePassphrase) throws CertificateException, NoSuchAlgorithmException, IOException { diff --git a/kubernetes-server-mock/pom.xml b/kubernetes-server-mock/pom.xml index 62b5296511b..3137615e029 100644 --- a/kubernetes-server-mock/pom.xml +++ b/kubernetes-server-mock/pom.xml @@ -63,6 +63,17 @@ ${slf4j.version} test + + + org.bouncycastle + bcprov-ext-jdk15on + ${bouncycastle.version} + + + org.bouncycastle + bcpkix-jdk15on + ${bouncycastle.version} + diff --git a/kubernetes-tests/pom.xml b/kubernetes-tests/pom.xml index 755f8c9b3b8..bc8a85ca0dd 100644 --- a/kubernetes-tests/pom.xml +++ b/kubernetes-tests/pom.xml @@ -64,6 +64,17 @@ + + org.bouncycastle + bcprov-ext-jdk15on + ${bouncycastle.version} + + + org.bouncycastle + bcpkix-jdk15on + ${bouncycastle.version} + + io.fabric8 mockwebserver diff --git a/openshift-client/pom.xml b/openshift-client/pom.xml index ff997519b94..ea3b3e0e5e5 100644 --- a/openshift-client/pom.xml +++ b/openshift-client/pom.xml @@ -208,6 +208,16 @@ test + + org.bouncycastle + bcprov-ext-jdk15on + ${bouncycastle.version} + + + org.bouncycastle + bcpkix-jdk15on + ${bouncycastle.version} + From e71b894211653263a84a598b34cc4117298ba096 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Thu, 14 Mar 2019 20:24:28 +0530 Subject: [PATCH 3/3] Upgrade bouncycastle to 1.61 + Upgrade bouncycastle to 1.61 --- platforms/karaf/features/src/main/resources/feature.xml | 5 +++-- pom.xml | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/platforms/karaf/features/src/main/resources/feature.xml b/platforms/karaf/features/src/main/resources/feature.xml index a672e7c6940..8c2ef4c0f29 100644 --- a/platforms/karaf/features/src/main/resources/feature.xml +++ b/platforms/karaf/features/src/main/resources/feature.xml @@ -19,14 +19,15 @@ mvn:javax.validation/validation-api/${validation.api.version} + mvn:org.bouncycastle/bcprov-ext-jdk15on/${bouncycastle.version} + mvn:org.bouncycastle/bcpkix-jdk15on/${bouncycastle.version} + mvn:com.google.code.findbugs/jsr305/${jsr305.version} mvn:com.fasterxml.jackson.core/jackson-core/${jackson.version} mvn:com.fasterxml.jackson.core/jackson-annotations/${jackson.bundle.version} mvn:com.fasterxml.jackson.core/jackson-databind/${jackson.bundle.version} mvn:com.fasterxml.jackson.dataformat/jackson-dataformat-yaml/${jackson.bundle.version} mvn:org.yaml/snakeyaml/${snakeyaml.version} - mvn:org.bouncycastle/bcprov-ext-jdk15on/${bouncycastle.version} - mvn:org.bouncycastle/bcpkix-jdk15on/${bouncycastle.version} mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.generex/${generex.bundle.version} mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.automaton/${automaton.bundle.version} mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.conscrypt-openjdk/${conscrypt-openjdk-uber.bundle.version} diff --git a/pom.xml b/pom.xml index dba8c990330..9bdb423feb7 100644 --- a/pom.xml +++ b/pom.xml @@ -102,7 +102,7 @@ 3.1.3 1.7.26 1.24 - 1.59 + 1.61 1.9.12 0.14.6 1.1.0.Final