Warning about SSL connection when connecting to MySQL database
JavaSslDatabase ConnectionMysql Error-1064Java Problem Overview
With the two classes below, I've tried connect to a MySQL database. However, I always get this error:
Wed Dec 09 22:46:52 CET 2015 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
This is the test class with the main
method:
public class TestDatabase {
public static void main(String[] args) {
Database db = new Database();
try {
db.connect();
} catch (Exception e) {
e.printStackTrace();
}
db.close();
}
}
This is the Database
class:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Database {
private Connection con;
public void connect() throws Exception{
if(con != null) return;
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
throw new Exception("No database");
}
String connectionURL = "jdbc:mysql://localhost:3306/Peoples";
con = DriverManager.getConnection(connectionURL, "root", "milos23");
}
public void close(){
if(con != null){
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
Java Solutions
Solution 1 - Java
Your connection URL should look like the below,
jdbc:mysql://localhost:3306/Peoples?autoReconnect=true&useSSL=false
This will disable SSL and also suppress the SSL errors.
Solution 2 - Java
How about using SSL but turning off server verification (such as when in development mode on your own computer):
jdbc:mysql://localhost:3306/Peoples?verifyServerCertificate=false&useSSL=true
Solution 3 - Java
The defaults for initiating a connection to a MySQL server were changed in the recent past, and (from a quick look through the most popular questions and answers on stack overflow) the new values are causing a lot of confusion. What is worse is that the standard advice seems to be to disable SSL altogether, which is a bit of a disaster in the making.
Now, if your connection is genuinely not exposed to the network (localhost only) or you are working in a non-production environment with no real data, then sure: there's no harm in disabling SSL by including the option useSSL=false
.
For everyone else, the following set of options are required to get SSL working with certificate and host verification:
- useSSL=true
- sslMode=VERIFY_IDENTITY
- trustCertificateKeyStoreUrl=file:path_to_keystore
- trustCertificateKeyStorePassword=password
As an added bonus, seeing as you're already playing with the options, it is simple to disable the weak SSL protocols too:
- enabledTLSProtocols=TLSv1.2
Example
So as a working example you'll need to follow the following broad steps:
First, make sure you have a valid certificate generated for the MySQL server host, and that the CA certificate is installed onto the client host (if you are using self-signed, then you'll likely need to do this manually, but for the popular public CAs it'll already be there).
Next, make sure that the java keystore contains all the CA certificates. On Debian/Ubuntu this is achieved by running:
update-ca-certificates -f
chmod 644 /etc/ssl/certs/java/cacerts
Then finally, update the connection string to include all the required options, which on Debian/Ubuntu would be something a bit like (adapt as required):
jdbc:mysql://{mysql_server}/confluence?useSSL=true&sslMode=VERIFY_IDENTITY&trustCertificateKeyStoreUrl=file%3A%2Fetc%2Fssl%2Fcerts%2Fjava%2Fcacerts&trustCertificateKeyStorePassword=changeit&enabledTLSProtocols=TLSv1.2&useUnicode=true&characterEncoding=utf8
Reference: https://beansandanicechianti.blogspot.com/2019/11/mysql-ssl-configuration.html
Solution 4 - Java
Mention the url
like:
jdbc:mysql://hostname:3306/hibernatedb?autoReconnect=true&useSSL=false
But in xml configuration when you mention &
sign, the IDE shows below error:
>The reference to entity "useSSL" must end with the ';' delimiter.
And then you have to explicitly use the &
instead of &
to be determined as &
by xml
thereafter in xml
you have to give the url in xml configuration like this:
<property name="connection.url">jdbc:mysql://hostname:3306/hibernatedb?autoReconnect=true&useSSL=false</property>
Solution 5 - Java
An alternative method would be:
Properties properties = new Properties();
properties.setProperty("user", "root");
properties.setProperty("password", "milos23);
properties.setProperty("useSSL", "false");
try (Connection conn = DriverManager.getConnection(connectionUrl, properties)) {
...
} catch (SQLException e) {
...
}
Solution 6 - Java
Use this to solve the problem in hive while making connection with MySQL
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://localhost/metastore?createDatabaseIfNotExist=true&autoReconnect=true&useSSL=false</value>
<description>metadata is stored in a MySQL server</description>
</property>
Solution 7 - Java
I found this warning too then I fixed it by using SSL=false suffix to the connection string like this example code.
Example:
connectionString = "jdbc:mysql://{server-name}:3306/%s?useUnicode=yes&characterEncoding=UTF-8&useSSL=false"
Solution 8 - Java
you need to user your mysql path like this:
<property name="url" value="jdbc:mysql://localhost:3306/world?useSSL=true"/>
Solution 9 - Java
This was OK for me:
this.conn = (Connection)DriverManager
.getConnection(url + dbName + "?useSSL=false", userName, password);
Solution 10 - Java
To disable the warning while connecting to a database in Java, use the below concept −
autoReconnect=true&useSSL=false
Just need to change connectionURL like :
String connectionURL = jdbc:mysql://localhost:3306/Peoples?autoReconnect=true&useSSL=false
This will disable SSL and also suppress the SSL errors.
Solution 11 - Java
I use this property for hibernate in config xml
<property name="hibernate.connection.url">
jdbc:mysql://localhost:3306/bookshop?serverTimezone=UTC&useSSL=false
</property>
without - serverTimezone=UTC - it doesn't work
Solution 12 - Java
Solution To fix it, append a useSSL=false at the end of the MySQL connection string :
ex.
application.properties
mysql datasource
spring.datasource.url=jdbc:mysql://localhost/dbname?useSSL=false
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
Solution 13 - Java
the new versions of mysql-connector establish SSL connection by default ...to solve it:
Download the older version of mysql-connector such as mysql-connector-java-5.0.8.zip
. . or . . Download OpenSSL for Windows and follow the instructions how to set it
Solution 14 - Java
Per https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-connp-props-security.html, sslModel
property replaced the deprecated legacy properties useSSL
, requireSSL
, and verifyServerCertificate
. So, you could use the connection string sslModel=DISABLED
.
Solution 15 - Java
Since I am currently in development mode I set useSSL to No not in tomcat but in mysql server configurations. Went to Manage Access Settings\Manage Server Connections from workbench -> Selected my connection. Inside connection tab went to SSL tab and disabled the settings. Worked for me.
Solution 16 - Java
Please update your mysql connector. That will help.
Solution 17 - Java
If your connection is genuinely exposed to the network or you are working in a production environment with real data, then sure: we shouldn't be disabling SSL by including the option useSSL=false.
Try to update the JDBC connection string to include the latest protocol version as foloowing: jdbc:mysql://
We have to explicitly mention the type of TLS protocol while establishing the DB connection in JDK 11.
Solution 18 - Java
Simply use Platform Independent zip or tar https://dev.mysql.com/downloads/connector/j/?os=26
Solution 19 - Java
As of 8.0.13 the useSSL
parameter is now deprecated and you should use sslMode
:
MySQL :: MySQL Connector/J 8.0 Developer Guide :: 6.3.5 Security
> sslMode > > By default, network connections are SSL encrypted; this property > permits secure connections to be turned off, or a different levels of > security to be chosen. The following values are allowed: "DISABLED" - > Establish unencrypted connections; "PREFERRED" - (default) Establish > encrypted connections if the server enabled them, otherwise fall back > to unencrypted connections; "REQUIRED" - Establish secure connections > if the server enabled them, fail otherwise; "VERIFY_CA" - Like > "REQUIRED" but additionally verify the server TLS certificate against > the configured Certificate Authority (CA) certificates; > "VERIFY_IDENTITY" - Like "VERIFY_CA", but additionally verify that the > server certificate matches the host to which the connection is > attempted. > > This property replaced the deprecated legacy properties "useSSL", > "requireSSL", and "verifyServerCertificate", which are still accepted > but translated into a value for "sslMode" if "sslMode" is not > explicitly set: "useSSL=false" is translated to "sslMode=DISABLED"; > > Unknown macro: {"useSSL=true", "requireSSL=false", > "verifyServerCertificate=false"} is translated to "sslMode=PREFERRED"; > > Unknown macro: {"useSSL=true", "requireSSL=true", > "verifyServerCertificate=false"} is translated to "sslMode=REQUIRED"; > > Unknown macro: {"useSSL=true" AND "verifyServerCertificate=true"} is > translated to "sslMode=VERIFY_CA". There is no equivalent legacy > settings for "sslMode=VERIFY_IDENTITY". Note that, for ALL server > versions, the default setting of "sslMode" is "PREFERRED", and it is > equivalent to the legacy settings of "useSSL=true", > "requireSSL=false", and "verifyServerCertificate=false", which are > different from their default settings for Connector/J 8.0.12 and > earlier in some situations. Applications that continue to use the > legacy properties and rely on their old default settings should be > reviewed. > > The legacy properties are ignored if "sslMode" is set explicitly. If > none of "sslMode" or "useSSL" is set explicitly, the default setting > of "sslMode=PREFERRED" applies. > > Default Value PREFERRED Since Version 8.0.13