diff --git a/services/src/main/java/org/keycloak/email/DefaultEmailSenderProvider.java b/services/src/main/java/org/keycloak/email/DefaultEmailSenderProvider.java index 102ae77092b..1b34f7f0ca2 100644 --- a/services/src/main/java/org/keycloak/email/DefaultEmailSenderProvider.java +++ b/services/src/main/java/org/keycloak/email/DefaultEmailSenderProvider.java @@ -185,8 +185,6 @@ public class DefaultEmailSenderProvider implements EmailSenderProvider { } private void setupTruststore(Properties props) { - boolean checkServerIdentity = true; - JSSETruststoreConfigurator configurator = new JSSETruststoreConfigurator(session); SSLSocketFactory factory = configurator.getSSLSocketFactory(); @@ -194,13 +192,9 @@ public class DefaultEmailSenderProvider implements EmailSenderProvider { props.put("mail.smtp.ssl.socketFactory", factory); if (configurator.getProvider().getPolicy() == HostnameVerificationPolicy.ANY) { props.setProperty("mail.smtp.ssl.trust", "*"); - checkServerIdentity = false; + props.put("mail.smtp.ssl.checkserveridentity", Boolean.FALSE.toString()); } } - - if (checkServerIdentity) { - props.put("mail.smtp.ssl.checkserveridentity", "true"); - } } @Override diff --git a/services/src/main/java/org/keycloak/truststore/FileTruststoreProvider.java b/services/src/main/java/org/keycloak/truststore/FileTruststoreProvider.java index 18cde87f893..f65de26ba47 100755 --- a/services/src/main/java/org/keycloak/truststore/FileTruststoreProvider.java +++ b/services/src/main/java/org/keycloak/truststore/FileTruststoreProvider.java @@ -34,7 +34,7 @@ public class FileTruststoreProvider implements TruststoreProvider { private final Map rootCertificates; private final Map intermediateCertificates; - FileTruststoreProvider(KeyStore truststore, HostnameVerificationPolicy policy, Map rootCertificates, Map intermediateCertificates) { + public FileTruststoreProvider(KeyStore truststore, HostnameVerificationPolicy policy, Map rootCertificates, Map intermediateCertificates) { this.policy = policy; this.truststore = truststore; this.rootCertificates = rootCertificates; diff --git a/testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/java/org/keycloak/testsuite/rest/TestingResourceProvider.java b/testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/java/org/keycloak/testsuite/rest/TestingResourceProvider.java index b403f5ff0ec..8c1fb0a7255 100644 --- a/testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/java/org/keycloak/testsuite/rest/TestingResourceProvider.java +++ b/testsuite/integration-arquillian/servers/auth-server/services/testsuite-providers/src/main/java/org/keycloak/testsuite/rest/TestingResourceProvider.java @@ -64,6 +64,7 @@ import org.keycloak.representations.idm.AuthenticationFlowRepresentation; import org.keycloak.representations.idm.EventRepresentation; import org.keycloak.representations.idm.UserRepresentation; import org.keycloak.services.ErrorPage; +import org.keycloak.services.ErrorResponse; import org.keycloak.services.managers.AuthenticationManager; import org.keycloak.services.resource.RealmResourceProvider; import org.keycloak.services.scheduled.ClearExpiredUserSessions; @@ -88,7 +89,9 @@ import org.keycloak.testsuite.runonserver.RunOnServer; import org.keycloak.testsuite.runonserver.SerializationUtil; import org.keycloak.testsuite.util.FeatureDeployerUtil; import org.keycloak.timer.TimerProvider; +import org.keycloak.truststore.FileTruststoreProvider; import org.keycloak.truststore.FileTruststoreProviderFactory; +import org.keycloak.truststore.HostnameVerificationPolicy; import org.keycloak.truststore.TruststoreProvider; import org.keycloak.util.JsonSerialization; import org.keycloak.utils.MediaType; @@ -113,6 +116,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -122,7 +126,6 @@ import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; import java.util.UUID; -import org.keycloak.services.ErrorResponse; /** * @author Stian Thorgersen @@ -1078,6 +1081,20 @@ public class TestingResourceProvider implements RealmResourceProvider { factory.setProvider(null); } + @GET + @Path("/modify-truststore-spi-hostname-policy") + @NoCache + public void modifyTruststoreSpiHostnamePolicy(@QueryParam("hostnamePolicy") final HostnameVerificationPolicy hostnamePolicy) { + FileTruststoreProviderFactory fact = (FileTruststoreProviderFactory) session.getKeycloakSessionFactory().getProviderFactory(TruststoreProvider.class); + this.factory.truststoreProvider = fact.create(session); + FileTruststoreProvider origTrustProvider = (FileTruststoreProvider) this.factory.truststoreProvider; + TruststoreProvider newTrustProvider = new FileTruststoreProvider( + origTrustProvider.getTruststore(), hostnamePolicy, + Collections.unmodifiableMap(origTrustProvider.getRootCertificates()), + Collections.unmodifiableMap(origTrustProvider.getIntermediateCertificates())); + fact.setProvider(newTrustProvider); + } + @GET @Path("/reenable-truststore-spi") @NoCache diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/client/resources/TestingResource.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/client/resources/TestingResource.java index 730a8780e23..4b0941490d4 100644 --- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/client/resources/TestingResource.java +++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/client/resources/TestingResource.java @@ -25,6 +25,7 @@ import org.keycloak.representations.idm.EventRepresentation; import org.keycloak.representations.idm.UserRepresentation; import org.keycloak.testsuite.components.TestProvider; import org.keycloak.testsuite.rest.representation.AuthenticatorState; +import org.keycloak.truststore.HostnameVerificationPolicy; import org.keycloak.utils.MediaType; import jakarta.ws.rs.Consumes; @@ -407,6 +408,15 @@ public interface TestingResource { @NoCache void disableTruststoreSpi(); + /** + * Temporarily changes the trustore SPI with another hostname verification policy. Call reenableTruststoreSpi to revert. + * @param hostnamePolicy The hostname verification policy to set + */ + @GET + @Path("/modify-truststore-spi-hostname-policy") + @NoCache + public void modifyTruststoreSpiHostnamePolicy(@QueryParam("hostnamePolicy") final HostnameVerificationPolicy hostnamePolicy); + /** * Re-enable truststore SPI after it was temporarily disabled by {@link #disableTruststoreSpi()} */ diff --git a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/updaters/RealmAttributeUpdater.java b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/updaters/RealmAttributeUpdater.java index 3932ebe75b5..56ad1317501 100644 --- a/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/updaters/RealmAttributeUpdater.java +++ b/testsuite/integration-arquillian/tests/base/src/main/java/org/keycloak/testsuite/updaters/RealmAttributeUpdater.java @@ -164,4 +164,9 @@ public class RealmAttributeUpdater extends ServerResourceUpdater