Skip to content

Commit 7314019

Browse files
committed
Add TLS- and virtual-host-related tests
Make sure hostname validation fails when using loopback.
1 parent 6a691aa commit 7314019

File tree

2 files changed

+79
-12
lines changed

2 files changed

+79
-12
lines changed

src/test/java/com/rabbitmq/client/amqp/impl/AuthorizationTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,18 @@ static void tearDownAll() {
5959
deleteVhost(VH);
6060
}
6161

62+
@Test
63+
void connectToLoopbackAndVirtualHostShouldSucceed() {
64+
try (Connection ignored =
65+
environment
66+
.connectionBuilder()
67+
.host("127.0.0.1")
68+
.username(USERNAME)
69+
.password(PASSWORD)
70+
.virtualHost(VH)
71+
.build()) {}
72+
}
73+
6274
@Test
6375
void connectionWithInvalidCredentialsShouldThrow() {
6476
assertThatThrownBy(

src/test/java/com/rabbitmq/client/amqp/impl/TlsTest.java

Lines changed: 67 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
1818
package com.rabbitmq.client.amqp.impl;
1919

20+
import static com.rabbitmq.client.amqp.impl.Cli.*;
2021
import static com.rabbitmq.client.amqp.impl.TestUtils.environmentBuilder;
22+
import static com.rabbitmq.client.amqp.impl.TlsTestUtils.*;
2123
import static java.lang.String.format;
2224
import static java.nio.charset.StandardCharsets.UTF_8;
2325
import static org.assertj.core.api.Assertions.assertThatThrownBy;
@@ -45,9 +47,7 @@ void publishWithVerifiedConnectionConsumeWithUnverifiedConnection(TestInfo info)
4547
environment
4648
.connectionBuilder()
4749
.tls()
48-
.sslContext(
49-
TlsTestUtils.sslContext(
50-
TlsTestUtils.trustManagerFactory(TlsTestUtils.caCertificate())))
50+
.sslContext(sslContext(trustManagerFactory(caCertificate())))
5151
.connection()
5252
.build();
5353
Connection consumingConnection =
@@ -106,9 +106,7 @@ void connectionConfigurationShouldOverrideEnvironmentConfiguration() throws Exce
106106
() ->
107107
env.connectionBuilder()
108108
.tls()
109-
.sslContext(
110-
TlsTestUtils.sslContext(
111-
TlsTestUtils.trustManagerFactory(TlsTestUtils.clientCertificate())))
109+
.sslContext(sslContext(trustManagerFactory(TlsTestUtils.clientCertificate())))
112110
.connection()
113111
.build())
114112
.isInstanceOf(AmqpException.AmqpSecurityException.class)
@@ -135,16 +133,14 @@ void trustEverythingSslContext() throws Exception {
135133

136134
@Test
137135
void verifiedConnectionWithCorrectServerCertificate() throws Exception {
138-
SSLContext sslContext =
139-
TlsTestUtils.sslContext(TlsTestUtils.trustManagerFactory(TlsTestUtils.caCertificate()));
136+
SSLContext sslContext = sslContext(trustManagerFactory(caCertificate()));
140137
try (Connection ignored =
141138
environment.connectionBuilder().tls().sslContext(sslContext).connection().build()) {}
142139
}
143140

144141
@Test
145142
void verifiedConnectionWithWrongServerCertificate() throws Exception {
146-
SSLContext sslContext =
147-
TlsTestUtils.sslContext(TlsTestUtils.trustManagerFactory(TlsTestUtils.clientCertificate()));
143+
SSLContext sslContext = sslContext(trustManagerFactory(TlsTestUtils.clientCertificate()));
148144
assertThatThrownBy(
149145
() -> environment.connectionBuilder().tls().sslContext(sslContext).connection().build())
150146
.isInstanceOf(AmqpException.AmqpSecurityException.class)
@@ -156,9 +152,9 @@ void verifiedConnectionWithWrongServerCertificate() throws Exception {
156152
void saslExternalShouldSucceedWithUserForClientCertificate() throws Exception {
157153
X509Certificate clientCertificate = TlsTestUtils.clientCertificate();
158154
SSLContext sslContext =
159-
TlsTestUtils.sslContext(
155+
sslContext(
160156
TlsTestUtils.keyManagerFactory(TlsTestUtils.clientKey(), clientCertificate),
161-
TlsTestUtils.trustManagerFactory(TlsTestUtils.caCertificate()));
157+
trustManagerFactory(caCertificate()));
162158
String username = clientCertificate.getSubjectX500Principal().getName();
163159
Cli.rabbitmqctlIgnoreError(format("delete_user %s", username));
164160
Cli.rabbitmqctl(format("add_user %s foo", username));
@@ -177,4 +173,63 @@ void saslExternalShouldSucceedWithUserForClientCertificate() throws Exception {
177173
Cli.rabbitmqctl(format("delete_user %s", username));
178174
}
179175
}
176+
177+
@Test
178+
void hostnameVerificationShouldFailWhenSettingHostToLoopbackInterface() throws Exception {
179+
SSLContext sslContext = sslContext(trustManagerFactory(caCertificate()));
180+
assertThatThrownBy(
181+
() ->
182+
environment
183+
.connectionBuilder()
184+
.host("127.0.0.1")
185+
.tls()
186+
.sslContext(sslContext)
187+
.connection()
188+
.build())
189+
.isInstanceOf(AmqpException.AmqpSecurityException.class)
190+
.cause()
191+
.isInstanceOf(SSLHandshakeException.class)
192+
.hasMessageContaining("subject alternative names");
193+
}
194+
195+
@Test
196+
void connectToLoopbackInterfaceShouldWorkIfNoHostnameVerification() throws Exception {
197+
SSLContext sslContext = sslContext(trustManagerFactory(caCertificate()));
198+
try (Connection ignored =
199+
environment
200+
.connectionBuilder()
201+
.host("127.0.01")
202+
.tls()
203+
.sslContext(sslContext)
204+
.hostnameVerification(false)
205+
.connection()
206+
.build()) {}
207+
}
208+
209+
@Test
210+
void connectToNonDefaultVirtualHostShouldSucceed() throws Exception {
211+
String vhost = "test_tls";
212+
String username = "tls";
213+
String password = "tls";
214+
try {
215+
addVhost(vhost);
216+
addUser(username, password);
217+
setPermissions(username, vhost, ".*");
218+
219+
SSLContext sslContext = sslContext(trustManagerFactory(caCertificate()));
220+
try (Connection ignored =
221+
environment
222+
.connectionBuilder()
223+
.username(username)
224+
.password(password)
225+
.virtualHost(vhost)
226+
.tls()
227+
.sslContext(sslContext)
228+
.connection()
229+
.build()) {}
230+
} finally {
231+
deleteUser(username);
232+
deleteVhost(vhost);
233+
}
234+
}
180235
}

0 commit comments

Comments
 (0)