Skip to content

Commit ca64aca

Browse files
Traderjoe95vietj
authored andcommitted
Add hostname verification tests for PG and MySQL
1 parent 12b48d4 commit ca64aca

3 files changed

Lines changed: 111 additions & 17 deletions

File tree

vertx-mysql-client/src/test/java/io/vertx/mysqlclient/MySQLTLSTest.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313

1414
import io.vertx.core.Future;
1515
import io.vertx.core.Vertx;
16+
import io.vertx.core.VertxOptions;
17+
import io.vertx.core.buffer.Buffer;
18+
import io.vertx.core.dns.AddressResolverOptions;
1619
import io.vertx.core.net.ClientSSLOptions;
1720
import io.vertx.core.net.PemKeyCertOptions;
1821
import io.vertx.core.net.PemTrustOptions;
@@ -295,6 +298,49 @@ public void testConnFailWithVerifyIdentitySslMode(TestContext ctx) {
295298
}));
296299
}
297300

301+
@Test
302+
public void testVerifyIdentityInvalidHostname(TestContext ctx) {
303+
options.setSslMode(SslMode.VERIFY_IDENTITY);
304+
options.getSslOptions()
305+
.setHostnameVerificationAlgorithm("HTTPS")
306+
.setTrustOptions(new PemTrustOptions().addCertPath("tls/files/ca.pem"))
307+
.setKeyCertOptions(new PemKeyCertOptions()
308+
.setCertPath("tls/files/client-cert.pem")
309+
.setKeyPath("tls/files/client-key.pem"));
310+
// The hostname in the test certificate is mysql.vertx.test, so 'localhost' should make for a failed connection
311+
options.setHost("localhost");
312+
313+
MySQLConnection.connect(vertx, options).onComplete( ctx.asyncAssertFailure(err -> {
314+
ctx.assertEquals(err.getMessage(), "No name matching localhost found");
315+
}));
316+
}
317+
318+
@Test
319+
public void testVerifyIdentityCorrectHostname(TestContext ctx) {
320+
Vertx vertxWithHosts = Vertx.vertx(
321+
new VertxOptions()
322+
.setAddressResolverOptions(
323+
new AddressResolverOptions()
324+
.setHostsValue(Buffer.buffer("127.0.0.1 mysql.vertx.test\n"))
325+
)
326+
);
327+
328+
options.setSslMode(SslMode.VERIFY_IDENTITY);
329+
options.getSslOptions()
330+
.setHostnameVerificationAlgorithm("HTTPS")
331+
.setTrustOptions(new PemTrustOptions().addCertPath("tls/files/ca.pem"))
332+
.setKeyCertOptions(new PemKeyCertOptions()
333+
.setCertPath("tls/files/client-cert.pem")
334+
.setKeyPath("tls/files/client-key.pem"));
335+
// The hostname in the test certificate is mysql.vertx.test
336+
options.setHost("mysql.vertx.test");
337+
338+
MySQLConnection.connect(vertxWithHosts, options).onComplete( ctx.asyncAssertSuccess(conn -> {
339+
ctx.assertTrue(conn.isSSL());
340+
vertxWithHosts.close();
341+
}));
342+
}
343+
298344
@Test
299345
public void testConnFail(TestContext ctx) {
300346
options.setSslMode(SslMode.REQUIRED);
Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
-----BEGIN CERTIFICATE-----
2-
MIIDBDCCAeygAwIBAgIBAjANBgkqhkiG9w0BAQsFADA8MTowOAYDVQQDDDFNeVNR
3-
TF9TZXJ2ZXJfOC4wLjE3X0F1dG9fR2VuZXJhdGVkX0NBX0NlcnRpZmljYXRlMB4X
4-
DTE5MDkwMjAzMjc1MVoXDTI5MDgzMDAzMjc1MVowQDE+MDwGA1UEAww1TXlTUUxf
5-
U2VydmVyXzguMC4xN19BdXRvX0dlbmVyYXRlZF9TZXJ2ZXJfQ2VydGlmaWNhdGUw
6-
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDg00pPuJv078OExAy7wfx/
7-
YsPiukl+OpyQAuF/45La5yDIwx3v55MxYqkX9TCuAIZUprWVllf51sOkNHsB/skC
8-
ZCYiXFlPmi9nCiK4TAuqN5c0rdjVdn8eFt4/CeAzHDC2bvoKbnOwDLKtponqbW8u
9-
nYkXWQDAxYyojxIUc3wNuyPkefFTkEjuIl3DyhyKZhfFPg0mbDB8t91gSB6oBrEa
10-
K9LMHJ4fWDsOSRLru8wUXPdstMD8zqKQjVfvG/4U5gb+dYycaZ+cRmPgHjarI+St
11-
R2ZG9wXs/J1wllciz4fr0je7+R2j7HHKqTY6JqSz0hZjd1Hej2zWAho1K5KqkDbt
12-
AgMBAAGjDTALMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggEBAAb0+bViRmYt
13-
Enm/jDGyGFCUGCbh8xnxREBLe3SZZTaJ8mVJOZ9wsC7NBCEqkgt6FzcSxIftF0Iz
14-
ppYpL0XqyYRMHnrtWZBzgkflhTltdNhVTl4sdfrYxJ7kAJ//WSk/wGsa6U7jD5SW
15-
I3rWfGOcVbnRA+rBDxslg7hSbnoIH19FUBqiIsAMQgSm1/6zlOsA7VPFvSVojSI8
16-
oGbOOmFsX/Jm793TJvT5ly8ZOCF/EMD+QnK/pS8BiDbTYauvU5Rzfl4fEQVW55YL
17-
YQAdSj/sUYAcv47Qlx7hp1GrLWHgVynTIC+kwEWKczNQofhL6Ewh3QutiwwD39+K
18-
KmqT2KQLyKA=
2+
MIIDZDCCAkygAwIBAgIUfAA0jelPI0Xwr+tkPO8Oz7OnNZkwDQYJKoZIhvcNAQEN
3+
BQAwPDE6MDgGA1UEAwwxTXlTUUxfU2VydmVyXzguMC4xN19BdXRvX0dlbmVyYXRl
4+
ZF9DQV9DZXJ0aWZpY2F0ZTAeFw0yNDAzMTExNTE2MDVaFw00NDAzMDYxNTE2MDVa
5+
MBsxGTAXBgNVBAMMEG15c3FsLnZlcnR4LnRlc3QwggEiMA0GCSqGSIb3DQEBAQUA
6+
A4IBDwAwggEKAoIBAQDg00pPuJv078OExAy7wfx/YsPiukl+OpyQAuF/45La5yDI
7+
wx3v55MxYqkX9TCuAIZUprWVllf51sOkNHsB/skCZCYiXFlPmi9nCiK4TAuqN5c0
8+
rdjVdn8eFt4/CeAzHDC2bvoKbnOwDLKtponqbW8unYkXWQDAxYyojxIUc3wNuyPk
9+
efFTkEjuIl3DyhyKZhfFPg0mbDB8t91gSB6oBrEaK9LMHJ4fWDsOSRLru8wUXPds
10+
tMD8zqKQjVfvG/4U5gb+dYycaZ+cRmPgHjarI+StR2ZG9wXs/J1wllciz4fr0je7
11+
+R2j7HHKqTY6JqSz0hZjd1Hej2zWAho1K5KqkDbtAgMBAAGjfzB9MAwGA1UdEwEB
12+
/wQCMAAwHQYDVR0OBBYEFIiHxyASKXMPzKI/uDEi36Afv6ExME4GA1UdIwRHMEWh
13+
QKQ+MDwxOjA4BgNVBAMMMU15U1FMX1NlcnZlcl84LjAuMTdfQXV0b19HZW5lcmF0
14+
ZWRfQ0FfQ2VydGlmaWNhdGWCAQEwDQYJKoZIhvcNAQENBQADggEBAAPIZqs8818j
15+
7+J6W7WDYlmVRyDK1BH/16/tAAUGSo7IJt09bSp6bm2eAlEp9nDgLLTQSPjfGz+f
16+
Zp1OIdeeKouOFeZfZ5924n7RS1eP49PGD2ZTpk551Rnthni7isL8fOwBx+kZzUIM
17+
7AQaEi8By5wpwcfNowSMlKR/Wm9OTGqZmmHSixK3HrI6yvHDJwe7fZ6dAl9DDViX
18+
j0hAQnuROsWz3aZkTF3DJ+CGlYjdQvArrazNgsrBbRvAH7VoGYICxahEYMRenXxz
19+
1Y1ITH7Mi/+53HQge/RoMCVSNQuyVgr3i5fgz5P+GFxdFc0HCC9uanD/PcObOhBs
20+
38m1J0pH5Q4=
1921
-----END CERTIFICATE-----

vertx-pg-client/src/test/java/io/vertx/pgclient/TLSTest.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
package io.vertx.pgclient;
1919

2020
import io.vertx.core.Vertx;
21+
import io.vertx.core.VertxOptions;
22+
import io.vertx.core.buffer.Buffer;
23+
import io.vertx.core.dns.AddressResolverOptions;
2124
import io.vertx.core.net.ClientSSLOptions;
2225
import io.vertx.core.net.PemTrustOptions;
2326
import io.vertx.ext.unit.Async;
@@ -173,4 +176,47 @@ public void testSslModeVerifyFullConf(TestContext ctx) {
173176
ctx.assertEquals("Host verification algorithm must be specified under verify-full sslmode", error.getMessage());
174177
}));
175178
}
179+
180+
@Test
181+
public void testSslModeVerifyFullInvalidHostname(TestContext ctx) {
182+
PgConnectOptions options = ruleOptionalSll.options()
183+
.setSslMode(SslMode.VERIFY_FULL)
184+
// The hostname in the test certificate is thebrain.ca, so 'localhost' should make for a failed connection
185+
.setHost("localhost")
186+
.setSslOptions(
187+
new ClientSSLOptions()
188+
.setHostnameVerificationAlgorithm("HTTPS")
189+
.setTrustOptions(new PemTrustOptions().addCertPath("tls/server.crt"))
190+
);
191+
192+
PgConnection.connect(vertx, options).onComplete( ctx.asyncAssertFailure(err -> {
193+
ctx.assertEquals(err.getMessage(), "SSL handshake failed");
194+
}));
195+
}
196+
197+
@Test
198+
public void testSslModeVerifyFullCorrectHostname(TestContext ctx) {
199+
Vertx vertxWithHosts = Vertx.vertx(
200+
new VertxOptions()
201+
.setAddressResolverOptions(
202+
new AddressResolverOptions()
203+
.setHostsValue(Buffer.buffer("127.0.0.1 thebrain.ca\n"))
204+
)
205+
);
206+
207+
PgConnectOptions options = ruleOptionalSll.options()
208+
.setSslMode(SslMode.VERIFY_FULL)
209+
// The hostname in the test certificate is thebrain.ca
210+
.setHost("thebrain.ca")
211+
.setSslOptions(
212+
new ClientSSLOptions()
213+
.setHostnameVerificationAlgorithm("HTTPS")
214+
.setTrustOptions(new PemTrustOptions().addCertPath("tls/server.crt"))
215+
);
216+
217+
PgConnection.connect(vertxWithHosts, options).onComplete( ctx.asyncAssertSuccess(conn -> {
218+
ctx.assertTrue(conn.isSSL());
219+
vertxWithHosts.close();
220+
}));
221+
}
176222
}

0 commit comments

Comments
 (0)