Skip to content

Commit 9989e6d

Browse files
authored
Make SslMode.PREFERRED the default for MySQL Client (#1615)
Resolves #1539 This matches the behavior of MySQL Connector/J. If the server supports encryption and reports that capability in the initial message, the connection should be upgraded to a secured connection. Signed-off-by: Thomas Segismont <tsegismont@gmail.com>
1 parent 453b809 commit 9989e6d

4 files changed

Lines changed: 19 additions & 18 deletions

File tree

vertx-mysql-client/src/main/asciidoc/index.adoc

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -562,10 +562,13 @@ More information about the `caching_sha2_password` authentication method can be
562562

563563
== Using SSL/TLS
564564

565-
To configure the client to use SSL connection, you can configure the {@link io.vertx.mysqlclient.MySQLConnectOptions}
566-
like a Vert.x `NetClient`.
567-
All https://dev.mysql.com/doc/refman/8.0/en/connection-options.html#option_general_ssl-mode[SSL modes] are supported and you are able to configure `sslmode`. The client is in `DISABLED` SSL mode by default.
568-
`ssl` parameter is kept as a mere shortcut for setting `sslmode`. `setSsl(true)` is equivalent to `setSslMode(VERIFY_CA)` and `setSsl(false)` is equivalent to `setSslMode(DISABLED)`.
565+
To configure the client to use SSL connection, you can configure the {@link io.vertx.mysqlclient.MySQLConnectOptions} like a Vert.x `NetClient`.
566+
567+
All https://dev.mysql.com/doc/refman/8.0/en/connection-options.html#option_general_ssl-mode[SSL modes] are supported, and you are able to configure `sslmode`.
568+
The client is in `PREFERRED` SSL mode by default, which automatically upgrades to SSL when the server supports encryption, falling back to non-SSL connections otherwise.
569+
This matches the behavior of MySQL Connector/J.
570+
571+
NOTE: To explicitly disable SSL, set the SSL mode to `DISABLED` in your connection options.
569572

570573
[source,$lang]
571574
----

vertx-mysql-client/src/main/java/io/vertx/mysqlclient/MySQLConnectOptions.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,18 @@
1616
import io.vertx.codegen.json.annotations.JsonGen;
1717
import io.vertx.core.buffer.Buffer;
1818
import io.vertx.core.json.JsonObject;
19-
import io.vertx.core.net.*;
19+
import io.vertx.core.net.ClientSSLOptions;
20+
import io.vertx.core.net.SocketAddress;
2021
import io.vertx.core.tracing.TracingPolicy;
2122
import io.vertx.mysqlclient.impl.MySQLCollation;
2223
import io.vertx.mysqlclient.impl.MySQLConnectionUriParser;
2324
import io.vertx.sqlclient.SqlConnectOptions;
2425

2526
import java.nio.charset.Charset;
26-
import java.util.*;
27-
import java.util.concurrent.TimeUnit;
27+
import java.util.Collections;
28+
import java.util.HashMap;
29+
import java.util.Map;
30+
import java.util.Objects;
2831
import java.util.function.Predicate;
2932

3033
/**
@@ -65,7 +68,7 @@ public static MySQLConnectOptions fromUri(String connectionUri) throws IllegalAr
6568
public static final String DEFAULT_CHARSET = "utf8mb4";
6669
public static final boolean DEFAULT_USE_AFFECTED_ROWS = false;
6770
public static final Map<String, String> DEFAULT_CONNECTION_ATTRIBUTES;
68-
public static final SslMode DEFAULT_SSL_MODE = SslMode.DISABLED;
71+
public static final SslMode DEFAULT_SSL_MODE = SslMode.PREFERRED;
6972
public static final String DEFAULT_CHARACTER_ENCODING = "UTF-8";
7073
public static final int DEFAULT_PIPELINING_LIMIT = 1;
7174

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

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@
2222
import io.vertx.ext.unit.TestContext;
2323
import io.vertx.ext.unit.junit.VertxUnitRunner;
2424
import io.vertx.mysqlclient.*;
25-
import io.vertx.tests.mysqlclient.junit.MySQLRule;
2625
import io.vertx.sqlclient.Pool;
2726
import io.vertx.sqlclient.PoolOptions;
2827
import io.vertx.sqlclient.Row;
28+
import io.vertx.tests.mysqlclient.junit.MySQLRule;
2929
import org.junit.After;
3030
import org.junit.Before;
3131
import org.junit.ClassRule;
@@ -94,7 +94,7 @@ public void testSuccessWithDisabledSslMode(TestContext ctx) {
9494

9595
@Test
9696
public void testTlsSuccessWithPreferredSslMode(TestContext ctx) {
97-
options.setSslMode(SslMode.PREFERRED);
97+
ctx.assertEquals(SslMode.PREFERRED, options.getSslMode(), "SslMode.PREFERRED should be the default");
9898
options.getSslOptions()
9999
.setTrustOptions(new PemTrustOptions().addCertPath("tls/files/ca.pem"))
100100
.setKeyCertOptions(new PemKeyCertOptions()
@@ -137,12 +137,6 @@ public void testTlsHandshakeFailWithPreferredSslMode(TestContext ctx) {
137137
@Test
138138
public void testNonTlsConnWithPreferredSslMode(TestContext ctx) {
139139
nonTlsOptions.setSslMode(SslMode.PREFERRED);
140-
options.getSslOptions()
141-
.setTrustOptions(new PemTrustOptions().addCertPath("tls/files/ca.pem"))
142-
.setKeyCertOptions(new PemKeyCertOptions()
143-
.setCertPath("tls/files/client-cert.pem")
144-
.setKeyPath("tls/files/client-key.pem"));
145-
146140
MySQLConnection.connect(vertx, nonTlsOptions).onComplete( ctx.asyncAssertSuccess(conn -> {
147141
ctx.assertFalse(conn.isSSL());
148142
conn

vertx-mysql-client/src/test/java/io/vertx/tests/mysqlclient/tck/MySQLConnectionAutoRetryTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
import io.vertx.ext.unit.TestContext;
1515
import io.vertx.ext.unit.junit.VertxUnitRunner;
1616
import io.vertx.mysqlclient.MySQLConnectOptions;
17+
import io.vertx.mysqlclient.SslMode;
1718
import io.vertx.tests.mysqlclient.junit.MySQLRule;
18-
import io.vertx.sqlclient.SqlConnectOptions;
1919
import io.vertx.tests.sqlclient.tck.ConnectionAutoRetryTestBase;
2020
import org.junit.ClassRule;
2121
import org.junit.runner.RunWith;
@@ -40,9 +40,10 @@ public void tearDown(TestContext ctx) {
4040

4141
@Override
4242
protected void initialConnector(int proxyPort) {
43-
SqlConnectOptions proxyOptions = new MySQLConnectOptions(options);
43+
MySQLConnectOptions proxyOptions = new MySQLConnectOptions(options);
4444
proxyOptions.setPort(proxyPort);
4545
proxyOptions.setHost("localhost");
46+
proxyOptions.setSslMode(SslMode.DISABLED);
4647
connectionConnector = ClientConfig.CONNECT.connect(vertx, proxyOptions);
4748
poolConnector = ClientConfig.POOLED.connect(vertx, proxyOptions);
4849
}

0 commit comments

Comments
 (0)