连接MySQL数据库时SSL连接的警告提示

361

使用以下两个类,我尝试连接到MySQL数据库。但是,我总是会收到此错误消息:

Wed Dec 09 22:46:52 CET 2015 WARN: 建议不要在没有服务器身份验证的情况下建立SSL连接。根据MySQL 5.5.45+、5.6.26+和5.7.6+的要求,如果没有显式设置选项,则必须默认建立SSL连接。为了符合不使用SSL的现有应用程序,将verifyServerCertificate属性设置为“false”。您需要通过设置useSSL=false来明确禁用SSL,或者设置useSSL=true并提供信任存储来进行服务器证书验证。

这是带有main方法的测试类:

public class TestDatabase {

    public static void main(String[] args) {
        Database db = new Database();
        try {
            db.connect();
        } catch (Exception e) {
            e.printStackTrace();
        }
        db.close();
    }
}

这是 Database 类:

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();
            }
        }
    }
}

3
谢谢回复,没关系,我只是不知道我需要在我的字符串连接URL的末尾加上ssl=true或false。 - Milos86
谢谢,那么新的connectionURL怎么样了? - user3290180
5
不是错误,而是警告。 - Fernando Silveira
自2006年以来,Class.forName("com.mysql.jdbc.Driver")这行代码就不再需要了。 - user207421
19个回答

6

我在配置xml中使用这个属性来进行Hibernate操作

<property name="hibernate.connection.url">
jdbc:mysql://localhost:3306/bookshop?serverTimezone=UTC&amp;useSSL=false
</property>

没有 serverTimezone=UTC - 它不起作用


4
解决方案 为了修复此问题,在MySQL连接字符串的末尾添加useSSL=false即可:
例如:
application.properties

mysql数据源

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

3

不是“sslModel”,而是“sslMode”。然而,这个变化发生在MySQL 8.0.13版本中。额外信息:https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-using-ssl.html - Tinel Barb

2

2
从8.0.13版本开始,useSSL参数已被弃用,请使用sslMode代替: MySQL :: MySQL Connector/J 8.0 开发者指南 :: 6.3.5 安全性

sslMode

默认情况下,网络连接是SSL加密的;此属性允许关闭安全连接或选择不同级别的安全性。允许以下值:"DISABLED" - 建立未加密连接;"PREFERRED" - (默认)如果服务器启用了加密连接,则建立加密连接,否则回退到未加密连接;"REQUIRED" - 如果服务器启用了安全连接,则建立安全连接,否则失败;"VERIFY_CA" - 类似于"REQUIRED",但还会根据配置的证书颁发机构(CA)证书验证服务器TLS证书;"VERIFY_IDENTITY" - 类似于"VERIFY_CA",但还会验证服务器证书是否与尝试连接的主机匹配。

此属性替换了已弃用的旧属性"useSSL"、"requireSSL"和"verifyServerCertificate",但仍然可以接受,如果没有明确设置"sslMode",则会将其转换为"sslMode"的值:"useSSL=false" 转换为 "sslMode=DISABLED";

未知宏:{"useSSL=true", "requireSSL=false", "verifyServerCertificate=false"} 转换为 "sslMode=PREFERRED";

未知宏:{"useSSL=true", "requireSSL=true", "verifyServerCertificate=false"} 转换为 "sslMode=REQUIRED";

未知宏:{"useSSL=true" AND "verifyServerCertificate=true"} 转换为 "sslMode=VERIFY_CA"。没有等效的旧版本设置可以用于"sslMode=VERIFY_IDENTITY"。请注意,对于所有服务器版本,"sslMode"的默认设置是"PREFERRED",它等同于"useSSL=true"、"requireSSL=false"和"verifyServerCertificate=false"的旧版本设置,在某些情况下与其8.0.12及更早版本的默认设置不同。继续使用旧属性并依赖其旧的默认设置的应用程序应该进行审核。

如果明确设置了"sslMode",则忽略旧版本属性。如果没有明确设置"sslMode"或"useSSL",则应用默认设置"sslMode=PREFERRED"。

默认值PREFERRED 自8.0.13版本起


1

由于我目前处于开发模式,所以我在mysql服务器配置中将useSSL设置为No,而不是在tomcat中进行设置。从workbench中的Manage Access Settings\Manage Server Connections进入 -> 选择我的连接。在连接选项卡中转到SSL选项卡并禁用设置。对我有用。


0
请更新您的MySQL连接器。这将有所帮助。

0
如果您的连接真正暴露在网络中,或者您正在使用真实数据的生产环境中工作,那么当然:我们不应该通过包括选项useSSL=false来禁用SSL。
尝试更新JDBC连接字符串以包含最新的协议版本,如下所示:jdbc:mysql://:/?enabledTLSProtocols=TLSv1.2
在JDK 11中建立DB连接时,我们必须明确提到TLS协议的类型。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接