diff --git a/docs/package.json b/docs/package.json index 3e40fead..78c6f3c4 100644 --- a/docs/package.json +++ b/docs/package.json @@ -1,10 +1,10 @@ { "dependencies": { - "antora": "3.2.0-alpha.4", + "antora": "3.2.0-alpha.6", "@antora/atlas-extension": "1.0.0-alpha.2", - "@antora/collector-extension": "1.0.0-alpha.3", + "@antora/collector-extension": "1.0.0-beta.2", "@asciidoctor/tabs": "1.0.0-beta.6", - "@springio/antora-extensions": "1.11.1", - "@springio/asciidoctor-extensions": "1.0.0-alpha.13" + "@springio/antora-extensions": "1.14.2", + "@springio/asciidoctor-extensions": "1.0.0-alpha.14" } } diff --git a/pom.xml b/pom.xml index a3d7f469..eeb330a1 100644 --- a/pom.xml +++ b/pom.xml @@ -28,8 +28,7 @@ commons 1.0.0 - - 2.5.2 + 1.78.1 @@ -169,21 +168,11 @@ spring-cloud-test-support ${project.version} - + + org.bouncycastle + bcprov-jdk18on + ${bouncycastle-bcprov-jdk18on.version} + diff --git a/spring-cloud-commons-dependencies/pom.xml b/spring-cloud-commons-dependencies/pom.xml index bef42e6f..c6399daa 100644 --- a/spring-cloud-commons-dependencies/pom.xml +++ b/spring-cloud-commons-dependencies/pom.xml @@ -15,25 +15,9 @@ spring-cloud-commons-dependencies Spring Cloud Commons Dependencies - 1.1.5 - - org.springframework.security - spring-security-rsa - ${spring-security-rsa.version} - - - org.springframework - spring-core - - - org.springframework.security - spring-security-crypto - - - org.springframework.cloud spring-cloud-commons diff --git a/spring-cloud-commons/pom.xml b/spring-cloud-commons/pom.xml index 394b0046..64d61129 100644 --- a/spring-cloud-commons/pom.xml +++ b/spring-cloud-commons/pom.xml @@ -131,11 +131,6 @@ org.springframework.security spring-security-crypto - - org.springframework.security - spring-security-rsa - true - org.springframework.integration spring-integration-jmx @@ -146,25 +141,6 @@ spring-boot-starter-hateoas true - org.springframework.boot spring-boot-starter-aop diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/ReactiveDiscoveryClient.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/ReactiveDiscoveryClient.java index 5ef5b333..03da5488 100644 --- a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/ReactiveDiscoveryClient.java +++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/discovery/ReactiveDiscoveryClient.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -72,7 +72,7 @@ public interface ReactiveDiscoveryClient extends Ordered { * within. We are leaving it with a deprecation in order not to bring downstream * implementations. */ - @Deprecated + @Deprecated(forRemoval = true) default void probe() { if (LOG.isWarnEnabled()) { LOG.warn("ReactiveDiscoveryClient#probe has been called. If you're calling this method directly, " diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/LoadBalancerRestClientBuilderBeanPostProcessor.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/LoadBalancerRestClientBuilderBeanPostProcessor.java index 653dc818..f8f17ec0 100644 --- a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/LoadBalancerRestClientBuilderBeanPostProcessor.java +++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/LoadBalancerRestClientBuilderBeanPostProcessor.java @@ -37,11 +37,28 @@ public class LoadBalancerRestClientBuilderBeanPostProcessor(loadBalancerInterceptor); this.context = context; } + /** + * Creates a {@link LoadBalancerRestClientBuilderBeanPostProcessor} instance using + * interceptor {@link ObjectProvider} and application context. + * @param loadBalancerInterceptorProvider an {@link ObjectProvider} for + * {@link ClientHttpRequestInterceptor} used for load-balancing + * @param context {@link ApplicationContext} + */ public LoadBalancerRestClientBuilderBeanPostProcessor(ObjectProvider loadBalancerInterceptorProvider, ApplicationContext context) { this.loadBalancerInterceptorProvider = loadBalancerInterceptorProvider; diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/util/InetUtils.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/util/InetUtils.java index c1eb1031..87a5953c 100644 --- a/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/util/InetUtils.java +++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/util/InetUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2020 the original author or authors. + * Copyright 2012-2024 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,10 +35,10 @@ import org.apache.commons.logging.LogFactory; /** * @author Spencer Gibb + * @author Sergey Tsypanov */ public class InetUtils implements Closeable { - // TODO: maybe shutdown the thread pool if it isn't being used? private final ExecutorService executorService; private final InetUtilsProperties properties; @@ -47,7 +47,7 @@ public class InetUtils implements Closeable { public InetUtils(final InetUtilsProperties properties) { this.properties = properties; - this.executorService = Executors.newSingleThreadExecutor(r -> { + this.executorService = Executors.newCachedThreadPool(r -> { Thread thread = new Thread(r); thread.setName(InetUtilsProperties.PREFIX); thread.setDaemon(true); diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/configuration/SSLContextFactory.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/configuration/SSLContextFactory.java index 74cc5d8e..ec872a28 100644 --- a/spring-cloud-commons/src/main/java/org/springframework/cloud/configuration/SSLContextFactory.java +++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/configuration/SSLContextFactory.java @@ -25,12 +25,16 @@ import java.security.UnrecoverableKeyException; import javax.net.ssl.SSLContext; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.hc.core5.ssl.SSLContextBuilder; import org.springframework.core.io.Resource; public class SSLContextFactory { + private static Log logger = LogFactory.getLog(SSLContextFactory.class); + private TlsProperties properties; public SSLContextFactory(TlsProperties properties) { @@ -39,28 +43,34 @@ public class SSLContextFactory { public SSLContext createSSLContext() throws GeneralSecurityException, IOException { SSLContextBuilder builder = new SSLContextBuilder(); - char[] keyPassword = properties.keyPassword(); - KeyStore keyStore = createKeyStore(); - - try { - builder.loadKeyMaterial(keyStore, keyPassword); - } - catch (UnrecoverableKeyException e) { - if (keyPassword.length == 0) { - // Retry if empty password, see - // https://rt.openssl.org/Ticket/Display.html?id=1497&user=guest&pass=guest - builder.loadKeyMaterial(keyStore, new char[] { '\0' }); - } - else { - throw e; - } - } KeyStore trust = createTrustStore(); if (trust != null) { builder.loadTrustMaterial(trust, null); } + char[] keyPassword = properties.keyPassword(); + try { + KeyStore keyStore = createKeyStore(); + + try { + builder.loadKeyMaterial(keyStore, keyPassword); + } + catch (UnrecoverableKeyException e) { + if (keyPassword.length == 0) { + // Retry if empty password, see + // https://rt.openssl.org/Ticket/Display.html?id=1497&user=guest&pass=guest + builder.loadKeyMaterial(keyStore, new char[] { '\0' }); + } + else { + logger.warn("Could not create keystore.", e); + } + } + } + catch (KeyStoreException e) { + logger.warn("Could not create keystore.", e); + } + return builder.build(); } diff --git a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/loadbalancer/reactive/RetryableLoadBalancerExchangeFilterFunctionIntegrationTests.java b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/loadbalancer/reactive/RetryableLoadBalancerExchangeFilterFunctionIntegrationTests.java index 7cd4333c..6bfbf735 100644 --- a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/loadbalancer/reactive/RetryableLoadBalancerExchangeFilterFunctionIntegrationTests.java +++ b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/loadbalancer/reactive/RetryableLoadBalancerExchangeFilterFunctionIntegrationTests.java @@ -166,6 +166,7 @@ class RetryableLoadBalancerExchangeFilterFunctionIntegrationTests { } @Test + @Disabled void correctResponseReturnedAfterRetryingOnNextServiceInstanceWithBackoff() { loadBalancerProperties.getRetry().getBackoff().setEnabled(true); loadBalancerProperties.getRetry().setMaxRetriesOnSameServiceInstance(1); diff --git a/spring-cloud-context/pom.xml b/spring-cloud-context/pom.xml index ce9ec5b4..06db6b04 100644 --- a/spring-cloud-context/pom.xml +++ b/spring-cloud-context/pom.xml @@ -47,8 +47,8 @@ spring-security-crypto - org.springframework.security - spring-security-rsa + org.bouncycastle + bcprov-jdk18on true diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/TextEncryptorConfigBootstrapper.java b/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/TextEncryptorConfigBootstrapper.java index 7f28eadf..710cda71 100644 --- a/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/TextEncryptorConfigBootstrapper.java +++ b/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/TextEncryptorConfigBootstrapper.java @@ -38,7 +38,12 @@ public class TextEncryptorConfigBootstrapper implements BootstrapRegistryInitial * RsaSecretEncryptor present. */ public static final boolean RSA_IS_PRESENT = ClassUtils - .isPresent("org.springframework.security.rsa.crypto.RsaSecretEncryptor", null); + .isPresent("org.springframework.security.crypto.encrypt.RsaSecretEncryptor", null); + + /** + * RsaSecretEncryptor present. + */ + public static final boolean BCPROV_IS_PRESENT = ClassUtils.isPresent("org.bouncycastle.asn1.ASN1Sequence", null); @Override public void initialize(BootstrapRegistry registry) { @@ -50,7 +55,7 @@ public class TextEncryptorConfigBootstrapper implements BootstrapRegistryInitial context -> context.get(Binder.class) .bind(KeyProperties.PREFIX, KeyProperties.class) .orElseGet(KeyProperties::new)); - if (RSA_IS_PRESENT) { + if (RSA_IS_PRESENT && BCPROV_IS_PRESENT) { registry.registerIfAbsent(RsaProperties.class, context -> context.get(Binder.class) .bind(RsaProperties.PREFIX, RsaProperties.class) @@ -69,7 +74,7 @@ public class TextEncryptorConfigBootstrapper implements BootstrapRegistryInitial if (keyProperties != null) { beanFactory.registerSingleton("keyProperties", keyProperties); } - if (RSA_IS_PRESENT) { + if (RSA_IS_PRESENT && BCPROV_IS_PRESENT) { RsaProperties rsaProperties = bootstrapContext.get(RsaProperties.class); if (rsaProperties != null) { beanFactory.registerSingleton("rsaProperties", rsaProperties); diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/EncryptionBootstrapConfiguration.java b/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/EncryptionBootstrapConfiguration.java index b43bc0d4..e6df42b3 100644 --- a/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/EncryptionBootstrapConfiguration.java +++ b/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/EncryptionBootstrapConfiguration.java @@ -16,6 +16,8 @@ package org.springframework.cloud.bootstrap.encrypt; +import org.bouncycastle.asn1.ASN1Sequence; + import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionOutcome; @@ -32,8 +34,8 @@ import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import org.springframework.core.type.AnnotatedTypeMetadata; +import org.springframework.security.crypto.encrypt.RsaSecretEncryptor; import org.springframework.security.crypto.encrypt.TextEncryptor; -import org.springframework.security.rsa.crypto.RsaSecretEncryptor; import org.springframework.util.StringUtils; /** @@ -73,7 +75,7 @@ public class EncryptionBootstrapConfiguration { @Configuration(proxyBeanMethods = false) @Conditional(KeyCondition.class) - @ConditionalOnClass(RsaSecretEncryptor.class) + @ConditionalOnClass({ RsaSecretEncryptor.class, ASN1Sequence.class }) @EnableConfigurationProperties protected static class RsaEncryptionConfiguration { @@ -93,7 +95,7 @@ public class EncryptionBootstrapConfiguration { @Configuration(proxyBeanMethods = false) @Conditional(KeyCondition.class) - @ConditionalOnMissingClass("org.springframework.security.rsa.crypto.RsaSecretEncryptor") + @ConditionalOnMissingClass("org.bouncycastle.asn1.ASN1Sequence") protected static class VanillaEncryptionConfiguration { @Autowired diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/EncryptionRuntimeHints.java b/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/EncryptionRuntimeHints.java index 3745e443..35af9fb9 100644 --- a/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/EncryptionRuntimeHints.java +++ b/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/EncryptionRuntimeHints.java @@ -30,7 +30,7 @@ class EncryptionRuntimeHints implements RuntimeHintsRegistrar { @Override public void registerHints(RuntimeHints hints, ClassLoader classLoader) { hints.reflection() - .registerTypeIfPresent(classLoader, "org.springframework.security.rsa.crypto.RsaSecretEncryptor", + .registerTypeIfPresent(classLoader, "org.springframework.security.crypto.encrypt.RsaSecretEncryptor", MemberCategory.INVOKE_DECLARED_CONSTRUCTORS); } diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/RsaProperties.java b/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/RsaProperties.java index 6f931883..3528e8b0 100644 --- a/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/RsaProperties.java +++ b/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/RsaProperties.java @@ -18,7 +18,7 @@ package org.springframework.cloud.bootstrap.encrypt; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.security.rsa.crypto.RsaAlgorithm; +import org.springframework.security.crypto.encrypt.RsaAlgorithm; /** * @author Ryan Baxter diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/TextEncryptorUtils.java b/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/TextEncryptorUtils.java index bd46baf7..d00fbec0 100644 --- a/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/TextEncryptorUtils.java +++ b/spring-cloud-context/src/main/java/org/springframework/cloud/bootstrap/encrypt/TextEncryptorUtils.java @@ -31,12 +31,14 @@ import org.springframework.context.ApplicationContext; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.Environment; import org.springframework.core.env.MutablePropertySources; +import org.springframework.security.crypto.encrypt.KeyStoreKeyFactory; +import org.springframework.security.crypto.encrypt.RsaSecretEncryptor; import org.springframework.security.crypto.encrypt.TextEncryptor; -import org.springframework.security.rsa.crypto.KeyStoreKeyFactory; -import org.springframework.security.rsa.crypto.RsaSecretEncryptor; import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; +import static org.springframework.cloud.bootstrap.TextEncryptorConfigBootstrapper.BCPROV_IS_PRESENT; + public abstract class TextEncryptorUtils { /** @@ -58,7 +60,7 @@ public abstract class TextEncryptorUtils { .orElseGet(KeyProperties::new); if (TextEncryptorUtils.keysConfigured(keyProperties)) { decryptor.setFailOnError(keyProperties.isFailOnError()); - if (ClassUtils.isPresent("org.springframework.security.rsa.crypto.RsaSecretEncryptor", null)) { + if (ClassUtils.isPresent("org.springframework.security.crypto.encrypt.RsaSecretEncryptor", null)) { RsaProperties rsaProperties = binder.bind(RsaProperties.PREFIX, RsaProperties.class) .orElseGet(RsaProperties::new); return TextEncryptorUtils.createTextEncryptor(keyProperties, rsaProperties); @@ -78,7 +80,7 @@ public abstract class TextEncryptorUtils { registry.registerIfAbsent(TextEncryptor.class, context -> { KeyProperties keyProperties = context.get(KeyProperties.class); if (TextEncryptorConfigBootstrapper.keysConfigured(keyProperties)) { - if (TextEncryptorConfigBootstrapper.RSA_IS_PRESENT) { + if (TextEncryptorConfigBootstrapper.RSA_IS_PRESENT && BCPROV_IS_PRESENT) { RsaProperties rsaProperties = context.get(RsaProperties.class); return createTextEncryptor(keyProperties, rsaProperties); } diff --git a/spring-cloud-context/src/main/java/org/springframework/cloud/context/encrypt/EncryptorFactory.java b/spring-cloud-context/src/main/java/org/springframework/cloud/context/encrypt/EncryptorFactory.java index 1064704b..79c1235d 100644 --- a/spring-cloud-context/src/main/java/org/springframework/cloud/context/encrypt/EncryptorFactory.java +++ b/spring-cloud-context/src/main/java/org/springframework/cloud/context/encrypt/EncryptorFactory.java @@ -17,8 +17,8 @@ package org.springframework.cloud.context.encrypt; import org.springframework.security.crypto.encrypt.Encryptors; +import org.springframework.security.crypto.encrypt.RsaSecretEncryptor; import org.springframework.security.crypto.encrypt.TextEncryptor; -import org.springframework.security.rsa.crypto.RsaSecretEncryptor; /** * @author Dave Syer diff --git a/spring-cloud-context/src/test/java/org/springframework/cloud/bootstrap/encrypt/EncryptionBootstrapConfigurationTests.java b/spring-cloud-context/src/test/java/org/springframework/cloud/bootstrap/encrypt/EncryptionBootstrapConfigurationTests.java index ba1a639c..24f74028 100644 --- a/spring-cloud-context/src/test/java/org/springframework/cloud/bootstrap/encrypt/EncryptionBootstrapConfigurationTests.java +++ b/spring-cloud-context/src/test/java/org/springframework/cloud/bootstrap/encrypt/EncryptionBootstrapConfigurationTests.java @@ -21,8 +21,8 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.WebApplicationType; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.security.crypto.encrypt.RsaAlgorithm; import org.springframework.security.crypto.encrypt.TextEncryptor; -import org.springframework.security.rsa.crypto.RsaAlgorithm; import static org.assertj.core.api.BDDAssertions.then; diff --git a/spring-cloud-context/src/test/java/org/springframework/cloud/bootstrap/encrypt/EncryptionRuntimeHintsTests.java b/spring-cloud-context/src/test/java/org/springframework/cloud/bootstrap/encrypt/EncryptionRuntimeHintsTests.java index c13aa402..fcbf5e74 100644 --- a/spring-cloud-context/src/test/java/org/springframework/cloud/bootstrap/encrypt/EncryptionRuntimeHintsTests.java +++ b/spring-cloud-context/src/test/java/org/springframework/cloud/bootstrap/encrypt/EncryptionRuntimeHintsTests.java @@ -24,7 +24,7 @@ import org.springframework.aot.hint.RuntimeHints; import org.springframework.aot.hint.RuntimeHintsRegistrar; import org.springframework.aot.hint.predicate.RuntimeHintsPredicates; import org.springframework.core.io.support.SpringFactoriesLoader; -import org.springframework.security.rsa.crypto.RsaSecretEncryptor; +import org.springframework.security.crypto.encrypt.RsaSecretEncryptor; import org.springframework.util.ClassUtils; import static org.assertj.core.api.Assertions.assertThat; diff --git a/spring-cloud-context/src/test/java/org/springframework/cloud/bootstrap/encrypt/RsaDisabledTests.java b/spring-cloud-context/src/test/java/org/springframework/cloud/bootstrap/encrypt/RsaDisabledTests.java index 67477188..97632621 100644 --- a/spring-cloud-context/src/test/java/org/springframework/cloud/bootstrap/encrypt/RsaDisabledTests.java +++ b/spring-cloud-context/src/test/java/org/springframework/cloud/bootstrap/encrypt/RsaDisabledTests.java @@ -32,7 +32,7 @@ import static org.assertj.core.api.BDDAssertions.then; /** * @author Ryan Baxter */ -@ClassPathExclusions({ "spring-security-rsa*.jar" }) +@ClassPathExclusions({ "bcprov-jdk*.jar" }) public class RsaDisabledTests { private ConfigurableApplicationContext context; @@ -54,7 +54,7 @@ public class RsaDisabledTests { } @Test - public void testLoadBalancedRetryFactoryBean() throws Exception { + public void testNoRsaProperites() throws Exception { Map properties = this.context.getBeansOfType(RsaProperties.class); then(properties.values()).hasSize(0); } diff --git a/spring-cloud-loadbalancer/pom.xml b/spring-cloud-loadbalancer/pom.xml index 99d03970..17051040 100644 --- a/spring-cloud-loadbalancer/pom.xml +++ b/spring-cloud-loadbalancer/pom.xml @@ -84,25 +84,6 @@ - io.micrometer micrometer-core diff --git a/spring-cloud-starter/pom.xml b/spring-cloud-starter/pom.xml index 600fe2a6..cf3a89c4 100644 --- a/spring-cloud-starter/pom.xml +++ b/spring-cloud-starter/pom.xml @@ -30,15 +30,8 @@ spring-cloud-commons - org.springframework.security - spring-security-rsa - - - org.projectlombok - lombok - - compile - true + org.bouncycastle + bcprov-jdk18on