Skip to content

Commit 98f17c7

Browse files
committed
Test client certificate authentication against non-default virtual host
1 parent 7314019 commit 98f17c7

File tree

1 file changed

+59
-25
lines changed

1 file changed

+59
-25
lines changed

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

Lines changed: 59 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@
2020
import static com.rabbitmq.client.amqp.impl.Cli.*;
2121
import static com.rabbitmq.client.amqp.impl.TestUtils.environmentBuilder;
2222
import static com.rabbitmq.client.amqp.impl.TlsTestUtils.*;
23-
import static java.lang.String.format;
2423
import static java.nio.charset.StandardCharsets.UTF_8;
2524
import static org.assertj.core.api.Assertions.assertThatThrownBy;
2625

2726
import com.rabbitmq.client.amqp.*;
27+
import com.rabbitmq.client.amqp.AmqpException.AmqpSecurityException;
2828
import com.rabbitmq.client.amqp.impl.TestUtils.DisabledIfAuthMechanismSslNotEnabled;
2929
import com.rabbitmq.client.amqp.impl.TestUtils.DisabledIfTlsNotEnabled;
3030
import java.security.cert.X509Certificate;
@@ -33,11 +33,17 @@
3333
import java.util.stream.IntStream;
3434
import javax.net.ssl.*;
3535
import org.junit.jupiter.api.*;
36+
import org.junit.jupiter.params.ParameterizedTest;
37+
import org.junit.jupiter.params.provider.ValueSource;
3638

3739
@DisabledIfTlsNotEnabled
3840
@AmqpTestInfrastructure
3941
public class TlsTest {
4042

43+
private static final String VH = "test_tls";
44+
private static final String USERNAME = "tls";
45+
private static final String PASSWORD = "tls";
46+
4147
static Environment environment;
4248

4349
@Test
@@ -106,10 +112,10 @@ void connectionConfigurationShouldOverrideEnvironmentConfiguration() throws Exce
106112
() ->
107113
env.connectionBuilder()
108114
.tls()
109-
.sslContext(sslContext(trustManagerFactory(TlsTestUtils.clientCertificate())))
115+
.sslContext(sslContext(trustManagerFactory(clientCertificate())))
110116
.connection()
111117
.build())
112-
.isInstanceOf(AmqpException.AmqpSecurityException.class)
118+
.isInstanceOf(AmqpSecurityException.class)
113119
.hasCauseInstanceOf(SSLHandshakeException.class);
114120
}
115121
}
@@ -140,37 +146,52 @@ void verifiedConnectionWithCorrectServerCertificate() throws Exception {
140146

141147
@Test
142148
void verifiedConnectionWithWrongServerCertificate() throws Exception {
143-
SSLContext sslContext = sslContext(trustManagerFactory(TlsTestUtils.clientCertificate()));
149+
SSLContext sslContext = sslContext(trustManagerFactory(clientCertificate()));
144150
assertThatThrownBy(
145151
() -> environment.connectionBuilder().tls().sslContext(sslContext).connection().build())
146-
.isInstanceOf(AmqpException.AmqpSecurityException.class)
152+
.isInstanceOf(AmqpSecurityException.class)
147153
.hasCauseInstanceOf(SSLHandshakeException.class);
148154
}
149155

150-
@Test
156+
@ParameterizedTest
157+
@ValueSource(strings = {DefaultConnectionSettings.DEFAULT_VIRTUAL_HOST, VH})
151158
@DisabledIfAuthMechanismSslNotEnabled
152-
void saslExternalShouldSucceedWithUserForClientCertificate() throws Exception {
153-
X509Certificate clientCertificate = TlsTestUtils.clientCertificate();
159+
void saslExternalShouldSucceedWithUserForClientCertificate(String vh) throws Exception {
160+
X509Certificate clientCertificate = clientCertificate();
154161
SSLContext sslContext =
155162
sslContext(
156-
TlsTestUtils.keyManagerFactory(TlsTestUtils.clientKey(), clientCertificate),
163+
keyManagerFactory(clientKey(), clientCertificate),
157164
trustManagerFactory(caCertificate()));
158165
String username = clientCertificate.getSubjectX500Principal().getName();
159-
Cli.rabbitmqctlIgnoreError(format("delete_user %s", username));
160-
Cli.rabbitmqctl(format("add_user %s foo", username));
166+
Runnable connect =
167+
() -> {
168+
try (Connection ignored =
169+
environment
170+
.connectionBuilder()
171+
.username(UUID.randomUUID().toString())
172+
.virtualHost(vh)
173+
.saslMechanism(ConnectionSettings.SASL_MECHANISM_EXTERNAL)
174+
.tls()
175+
.sslContext(sslContext)
176+
.connection()
177+
.build()) {}
178+
};
179+
// there is no user with the client certificate's subject DN
180+
assertThatThrownBy(connect::run).isInstanceOf(AmqpSecurityException.class);
161181
try {
162-
Cli.rabbitmqctl(format("set_permissions %s '.*' '.*' '.*'", username));
182+
setUpVirtualHost(vh, username, username);
163183
try (Connection ignored =
164184
environment
165185
.connectionBuilder()
166186
.username(UUID.randomUUID().toString())
187+
.virtualHost(vh)
167188
.saslMechanism(ConnectionSettings.SASL_MECHANISM_EXTERNAL)
168189
.tls()
169190
.sslContext(sslContext)
170191
.connection()
171192
.build()) {}
172193
} finally {
173-
Cli.rabbitmqctl(format("delete_user %s", username));
194+
tearDownVirtualHost(vh, username);
174195
}
175196
}
176197

@@ -186,7 +207,7 @@ void hostnameVerificationShouldFailWhenSettingHostToLoopbackInterface() throws E
186207
.sslContext(sslContext)
187208
.connection()
188209
.build())
189-
.isInstanceOf(AmqpException.AmqpSecurityException.class)
210+
.isInstanceOf(AmqpSecurityException.class)
190211
.cause()
191212
.isInstanceOf(SSLHandshakeException.class)
192213
.hasMessageContaining("subject alternative names");
@@ -208,28 +229,41 @@ void connectToLoopbackInterfaceShouldWorkIfNoHostnameVerification() throws Excep
208229

209230
@Test
210231
void connectToNonDefaultVirtualHostShouldSucceed() throws Exception {
211-
String vhost = "test_tls";
212-
String username = "tls";
213-
String password = "tls";
214232
try {
215-
addVhost(vhost);
216-
addUser(username, password);
217-
setPermissions(username, vhost, ".*");
233+
setUpVirtualHost(VH, USERNAME, PASSWORD);
218234

219235
SSLContext sslContext = sslContext(trustManagerFactory(caCertificate()));
220236
try (Connection ignored =
221237
environment
222238
.connectionBuilder()
223-
.username(username)
224-
.password(password)
225-
.virtualHost(vhost)
239+
.username(USERNAME)
240+
.password(PASSWORD)
241+
.virtualHost(VH)
226242
.tls()
227243
.sslContext(sslContext)
228244
.connection()
229245
.build()) {}
230246
} finally {
231-
deleteUser(username);
232-
deleteVhost(vhost);
247+
tearDownVirtualHost(VH, USERNAME);
248+
}
249+
}
250+
251+
private static void setUpVirtualHost(String vh, String username, String password) {
252+
if (!isDefaultVirtualHost(vh)) {
253+
addVhost(vh);
233254
}
255+
addUser(username, password);
256+
setPermissions(username, vh, ".*");
257+
}
258+
259+
private static void tearDownVirtualHost(String vh, String username) {
260+
deleteUser(username);
261+
if (!isDefaultVirtualHost(vh)) {
262+
deleteVhost(vh);
263+
}
264+
}
265+
266+
private static boolean isDefaultVirtualHost(String vh) {
267+
return DefaultConnectionSettings.DEFAULT_VIRTUAL_HOST.equals(vh);
234268
}
235269
}

0 commit comments

Comments
 (0)