From 458ed72f551f384dc5515a22ba989f5748dfd138 Mon Sep 17 00:00:00 2001 From: ohchanKyu Date: Fri, 11 Sep 2026 19:56:09 +0900 Subject: [PATCH 1/2] Use TLS port for Docker Compose RabbitMQ connection when SSL is configured When a rabbitmq Docker Compose service has SSL bundle labels, RabbitDockerComposeConnectionDetailsFactory created an SslBundle but still resolved the address from container port 5672, the plain AMQP listener. As the connection factory enables SSL when an SslBundle is present, the TLS handshake was attempted against the non-TLS listener and the connection failed. The address is now resolved from container port 5671 when an SslBundle is present, matching RabbitStreamDockerComposeConnectionDetailsFactory and the Testcontainers-based RabbitContainerConnectionDetailsFactory. The SSL integration test now opens a connection using the resolved address and SslBundle so that it fails without this fix. Signed-off-by: ohchanKyu See gh-51666 --- ...nectionDetailsFactoryIntegrationTests.java | 21 ++++++++++++++++++- ...DockerComposeConnectionDetailsFactory.java | 5 ++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/module/spring-boot-amqp/src/dockerTest/java/org/springframework/boot/amqp/docker/compose/RabbitDockerComposeConnectionDetailsFactoryIntegrationTests.java b/module/spring-boot-amqp/src/dockerTest/java/org/springframework/boot/amqp/docker/compose/RabbitDockerComposeConnectionDetailsFactoryIntegrationTests.java index cab917ea4c5..53dfa91b1b7 100644 --- a/module/spring-boot-amqp/src/dockerTest/java/org/springframework/boot/amqp/docker/compose/RabbitDockerComposeConnectionDetailsFactoryIntegrationTests.java +++ b/module/spring-boot-amqp/src/dockerTest/java/org/springframework/boot/amqp/docker/compose/RabbitDockerComposeConnectionDetailsFactoryIntegrationTests.java @@ -16,6 +16,9 @@ package org.springframework.boot.amqp.docker.compose; +import com.rabbitmq.client.Connection; +import com.rabbitmq.client.ConnectionFactory; + import org.springframework.boot.amqp.autoconfigure.RabbitConnectionDetails; import org.springframework.boot.amqp.autoconfigure.RabbitConnectionDetails.Address; import org.springframework.boot.docker.compose.service.connection.test.DockerComposeTest; @@ -42,10 +45,26 @@ class RabbitDockerComposeConnectionDetailsFactoryIntegrationTests { @DockerComposeTest(composeFile = "rabbit-ssl-compose.yaml", image = TestImage.RABBITMQ, additionalResources = { "ca.crt", "server.crt", "server.key", "client.crt", "client.key", "rabbitmq.conf" }) - void runWithSslCreatesConnectionDetails(RabbitConnectionDetails connectionDetails) { + void runWithSslCreatesConnectionDetails(RabbitConnectionDetails connectionDetails) throws Exception { assertConnectionDetails(connectionDetails); SslBundle sslBundle = connectionDetails.getSslBundle(); assertThat(sslBundle).isNotNull(); + assertThatSslConnectionCanBeMade(connectionDetails, sslBundle); + } + + private void assertThatSslConnectionCanBeMade(RabbitConnectionDetails connectionDetails, SslBundle sslBundle) + throws Exception { + ConnectionFactory connectionFactory = new ConnectionFactory(); + Address address = connectionDetails.getFirstAddress(); + connectionFactory.setHost(address.host()); + connectionFactory.setPort(address.port()); + connectionFactory.setUsername(connectionDetails.getUsername()); + connectionFactory.setPassword(connectionDetails.getPassword()); + connectionFactory.setVirtualHost(connectionDetails.getVirtualHost()); + connectionFactory.useSslProtocol(sslBundle.createSslContext()); + try (Connection connection = connectionFactory.newConnection()) { + assertThat(connection.isOpen()).isTrue(); + } } private void assertConnectionDetails(RabbitConnectionDetails connectionDetails) { diff --git a/module/spring-boot-amqp/src/main/java/org/springframework/boot/amqp/docker/compose/RabbitDockerComposeConnectionDetailsFactory.java b/module/spring-boot-amqp/src/main/java/org/springframework/boot/amqp/docker/compose/RabbitDockerComposeConnectionDetailsFactory.java index a601ab093c3..31b1cfdc35e 100644 --- a/module/spring-boot-amqp/src/main/java/org/springframework/boot/amqp/docker/compose/RabbitDockerComposeConnectionDetailsFactory.java +++ b/module/spring-boot-amqp/src/main/java/org/springframework/boot/amqp/docker/compose/RabbitDockerComposeConnectionDetailsFactory.java @@ -40,6 +40,8 @@ class RabbitDockerComposeConnectionDetailsFactory private static final int RABBITMQ_PORT = 5672; + private static final int RABBITMQ_TLS_PORT = 5671; + protected RabbitDockerComposeConnectionDetailsFactory() { super("rabbitmq"); } @@ -66,7 +68,8 @@ class RabbitDockerComposeConnectionDetailsFactory super(service); this.environment = new RabbitEnvironment(service.env()); this.sslBundle = getSslBundle(service); - this.addresses = List.of(new Address(service.host(), service.ports().get(RABBITMQ_PORT))); + int containerPort = (this.sslBundle != null) ? RABBITMQ_TLS_PORT : RABBITMQ_PORT; + this.addresses = List.of(new Address(service.host(), service.ports().get(containerPort))); } @Override From 18295bf297fae495d8f66e11254bfb5987088c86 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Fri, 11 Sep 2026 12:42:51 +0100 Subject: [PATCH 2/2] Polish "Use TLS port for Docker Compose RabbitMQ connection when SSL is configured" See gh-51666 Signed-off-by: Andy Wilkinson --- ...nectionDetailsFactoryIntegrationTests.java | 41 ++++++++++--------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/module/spring-boot-amqp/src/dockerTest/java/org/springframework/boot/amqp/docker/compose/RabbitDockerComposeConnectionDetailsFactoryIntegrationTests.java b/module/spring-boot-amqp/src/dockerTest/java/org/springframework/boot/amqp/docker/compose/RabbitDockerComposeConnectionDetailsFactoryIntegrationTests.java index 53dfa91b1b7..ed8f07ea4ad 100644 --- a/module/spring-boot-amqp/src/dockerTest/java/org/springframework/boot/amqp/docker/compose/RabbitDockerComposeConnectionDetailsFactoryIntegrationTests.java +++ b/module/spring-boot-amqp/src/dockerTest/java/org/springframework/boot/amqp/docker/compose/RabbitDockerComposeConnectionDetailsFactoryIntegrationTests.java @@ -38,7 +38,7 @@ import static org.assertj.core.api.Assertions.assertThat; class RabbitDockerComposeConnectionDetailsFactoryIntegrationTests { @DockerComposeTest(composeFile = "rabbit-compose.yaml", image = TestImage.RABBITMQ) - void runCreatesConnectionDetails(RabbitConnectionDetails connectionDetails) { + void runCreatesConnectionDetails(RabbitConnectionDetails connectionDetails) throws Exception { assertConnectionDetails(connectionDetails); assertThat(connectionDetails.getSslBundle()).isNull(); } @@ -47,27 +47,10 @@ class RabbitDockerComposeConnectionDetailsFactoryIntegrationTests { additionalResources = { "ca.crt", "server.crt", "server.key", "client.crt", "client.key", "rabbitmq.conf" }) void runWithSslCreatesConnectionDetails(RabbitConnectionDetails connectionDetails) throws Exception { assertConnectionDetails(connectionDetails); - SslBundle sslBundle = connectionDetails.getSslBundle(); - assertThat(sslBundle).isNotNull(); - assertThatSslConnectionCanBeMade(connectionDetails, sslBundle); + assertThat(connectionDetails.getSslBundle()).isNotNull(); } - private void assertThatSslConnectionCanBeMade(RabbitConnectionDetails connectionDetails, SslBundle sslBundle) - throws Exception { - ConnectionFactory connectionFactory = new ConnectionFactory(); - Address address = connectionDetails.getFirstAddress(); - connectionFactory.setHost(address.host()); - connectionFactory.setPort(address.port()); - connectionFactory.setUsername(connectionDetails.getUsername()); - connectionFactory.setPassword(connectionDetails.getPassword()); - connectionFactory.setVirtualHost(connectionDetails.getVirtualHost()); - connectionFactory.useSslProtocol(sslBundle.createSslContext()); - try (Connection connection = connectionFactory.newConnection()) { - assertThat(connection.isOpen()).isTrue(); - } - } - - private void assertConnectionDetails(RabbitConnectionDetails connectionDetails) { + private void assertConnectionDetails(RabbitConnectionDetails connectionDetails) throws Exception { assertThat(connectionDetails.getUsername()).isEqualTo("myuser"); assertThat(connectionDetails.getPassword()).isEqualTo("secret"); assertThat(connectionDetails.getVirtualHost()).isEqualTo("/"); @@ -75,6 +58,24 @@ class RabbitDockerComposeConnectionDetailsFactoryIntegrationTests { Address address = connectionDetails.getFirstAddress(); assertThat(address.host()).isNotNull(); assertThat(address.port()).isGreaterThan(0); + assertThatConnectionCanBeMade(connectionDetails); + } + + private void assertThatConnectionCanBeMade(RabbitConnectionDetails connectionDetails) throws Exception { + ConnectionFactory connectionFactory = new ConnectionFactory(); + Address address = connectionDetails.getFirstAddress(); + connectionFactory.setHost(address.host()); + connectionFactory.setPort(address.port()); + connectionFactory.setUsername(connectionDetails.getUsername()); + connectionFactory.setPassword(connectionDetails.getPassword()); + connectionFactory.setVirtualHost(connectionDetails.getVirtualHost()); + SslBundle sslBundle = connectionDetails.getSslBundle(); + if (sslBundle != null) { + connectionFactory.useSslProtocol(sslBundle.createSslContext()); + } + try (Connection connection = connectionFactory.newConnection()) { + assertThat(connection.isOpen()).isTrue(); + } } }