Skip to content

Commit 88ce0a3

Browse files
authored
Merge pull request #1426 from Traderjoe95/hostname-verification-reproducer
Don't disable hostname verification for SQL clients unconditionally
2 parents 4cdf60f + b4d5f96 commit 88ce0a3

File tree

5 files changed

+118
-18
lines changed

5 files changed

+118
-18
lines changed

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

Lines changed: 48 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.PemKeyCertOptions;
1720
import io.vertx.core.net.PemTrustOptions;
1821
import io.vertx.ext.unit.TestContext;
@@ -260,6 +263,51 @@ public void testConnFailWithVerifyIdentitySslMode(TestContext ctx) {
260263
}));
261264
}
262265

266+
@Test
267+
public void testTLSInvalidHostname(TestContext ctx) {
268+
MySQLConnection.connect(
269+
vertx,
270+
options
271+
.setSslMode(SslMode.VERIFY_IDENTITY)
272+
// The hostname in the test certificate is mysql.vertx.test, so 'localhost' should make for a failed connection
273+
.setHost("localhost")
274+
.setHostnameVerificationAlgorithm("HTTPS")
275+
.setPemTrustOptions(new PemTrustOptions().addCertPath("tls/files/ca.pem"))
276+
.setPemKeyCertOptions(new PemKeyCertOptions()
277+
.setCertPath("tls/files/client-cert.pem")
278+
.setKeyPath("tls/files/client-key.pem")),
279+
ctx.asyncAssertFailure(err -> {
280+
ctx.assertEquals(err.getMessage(), "No name matching localhost found");
281+
}));
282+
}
283+
284+
@Test
285+
public void testTLSCorrectHostname(TestContext ctx) {
286+
Vertx vertxWithHosts = Vertx.vertx(
287+
new VertxOptions()
288+
.setAddressResolverOptions(
289+
new AddressResolverOptions()
290+
.setHostsValue(Buffer.buffer("127.0.0.1 mysql.vertx.test\n"))
291+
)
292+
);
293+
294+
MySQLConnection.connect(
295+
vertxWithHosts,
296+
options
297+
.setSslMode(SslMode.VERIFY_IDENTITY)
298+
// The hostname in the test certificate is mysql.vertx.test
299+
.setHost("mysql.vertx.test")
300+
.setHostnameVerificationAlgorithm("HTTPS")
301+
.setPemTrustOptions(new PemTrustOptions().addCertPath("tls/files/ca.pem"))
302+
.setPemKeyCertOptions(new PemKeyCertOptions()
303+
.setCertPath("tls/files/client-cert.pem")
304+
.setKeyPath("tls/files/client-key.pem")),
305+
ctx.asyncAssertSuccess(conn -> {
306+
ctx.assertTrue(conn.isSSL());
307+
vertxWithHosts.close();
308+
}));
309+
}
310+
263311
@Test
264312
public void testConnFail(TestContext ctx) {
265313
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.PemTrustOptions;
2225
import io.vertx.ext.unit.Async;
2326
import io.vertx.ext.unit.TestContext;
@@ -94,6 +97,49 @@ public void testTLSInvalidCertificate(TestContext ctx) {
9497
}));
9598
}
9699

100+
@Test
101+
public void testTLSInvalidHostname(TestContext ctx) {
102+
Async async = ctx.async();
103+
PgConnection.connect(
104+
vertx,
105+
ruleOptionalSll.options()
106+
.setSslMode(SslMode.VERIFY_FULL)
107+
// The hostname in the test certificate is thebrain.ca, so 'localhost' should make for a failed connection
108+
.setHost("localhost")
109+
.setHostnameVerificationAlgorithm("HTTPS")
110+
.setPemTrustOptions(new PemTrustOptions().addCertPath("tls/server.crt")),
111+
ctx.asyncAssertFailure(err -> {
112+
ctx.assertEquals(err.getMessage(), "SSL handshake failed");
113+
async.complete();
114+
}));
115+
}
116+
117+
@Test
118+
public void testTLSCorrectHostname(TestContext ctx) {
119+
Vertx vertxWithHosts = Vertx.vertx(
120+
new VertxOptions()
121+
.setAddressResolverOptions(
122+
new AddressResolverOptions()
123+
.setHostsValue(Buffer.buffer("127.0.0.1 thebrain.ca\n"))
124+
)
125+
);
126+
127+
Async async = ctx.async();
128+
PgConnection.connect(
129+
vertxWithHosts,
130+
ruleOptionalSll.options()
131+
.setSslMode(SslMode.VERIFY_FULL)
132+
// The hostname in the test certificate is thebrain.ca
133+
.setHost("thebrain.ca")
134+
.setHostnameVerificationAlgorithm("HTTPS")
135+
.setPemTrustOptions(new PemTrustOptions().addCertPath("tls/server.crt")),
136+
ctx.asyncAssertSuccess(conn -> {
137+
ctx.assertTrue(conn.isSSL());
138+
vertxWithHosts.close();
139+
async.complete();
140+
}));
141+
}
142+
97143
@Test
98144
public void testSslModeDisable(TestContext ctx) {
99145
Async async = ctx.async();

vertx-pg-client/src/test/resources/tls/ssl.sh

100644100755
File mode changed.

vertx-sql-client/src/main/java/io/vertx/sqlclient/impl/ConnectionFactoryBase.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,11 @@ protected NetClient netClient(NetClientOptions options) {
5858
if (options.getClass() != NetClientOptions.class) {
5959
options = new NetClientOptions(options);
6060
}
61-
options.setHostnameVerificationAlgorithm("");
61+
62+
if (options.getHostnameVerificationAlgorithm() == null) {
63+
options.setHostnameVerificationAlgorithm("");
64+
}
65+
6266
JsonObject key = options.toJson();
6367
NetClient client;
6468
synchronized (this) {

0 commit comments

Comments
 (0)