连接到 MySQL 数据库时有关 SSL 连接的警告

Posted

技术标签:

【中文标题】连接到 MySQL 数据库时有关 SSL 连接的警告【英文标题】:Warning about SSL connection when connecting to MySQL database 【发布时间】:2016-03-15 08:56:03 【问题描述】:

通过以下两个类,我尝试连接到 mysql 数据库。但是,我总是收到此错误:

Wed Dec 09 22:46:52 CET 2015 警告:不建议在没有服务器身份验证的情况下建立 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();
            
        
    

【问题讨论】:

感谢您的回复,没关系,我只是不知道我需要将 ssl=true 或 false 放在 String connectionURL 的末尾。 谢谢,那么新的connectionURL怎么样? 这不是错误,而是警告。 【参考方案1】:

只需使用平台无关的 zip 或 tar https://dev.mysql.com/downloads/connector/j/?os=26

【讨论】:

【参考方案2】:

如果您的连接真正暴露在网络中,或者您正在使用真实数据的生产环境中工作,那么请确定:我们不应该通过包含选项 useSSL=false 来禁用 SSL。

尝试更新 JDBC 连接字符串以包含最新的协议版本,如下所示:jdbc:mysql://:/?enabledTLSProtocols=TLSv1.2

在 JDK 11 中建立数据库连接时,我们必须明确提及 TLS 协议的类型。

【讨论】:

【参考方案3】:

请更新您的 mysql 连接器。这会有所帮助。

【讨论】:

【参考方案4】:

每个https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-connp-props-security.htmlsslModel 属性替换了已弃用的旧属性useSSLrequireSSLverifyServerCertificate。所以,你可以使用连接字符串sslModel=DISABLED

【讨论】:

【参考方案5】:

要在使用 Java 连接数据库时禁用警告,请使用以下概念 -

autoReconnect=true&useSSL=false

只需要更改connectionURL,例如:

String connectionURL = jdbc:mysql://localhost:3306/Peoples?autoReconnect=true&useSSL=false

这将禁用 SSL 并抑制 SSL 错误。

【讨论】:

【参考方案6】:

提及 url 喜欢:

jdbc:mysql://hostname:3306/hibernatedb?autoReconnect=true&useSSL=false

但是在xml配置中,当你提到&符号时,IDE会显示如下错误:

对实体“useSSL”的引用必须以“;”结尾分隔符。

然后您必须明确使用 & 而不是 & 才能被@987654327 确定为 & @ 此后在 xml 中,您必须像这样在 xml 配置中提供 url:

<property name="connection.url">jdbc:mysql://hostname:3306/hibernatedb?autoReconnect=true&amp;useSSL=false</property>

【讨论】:

@caot 对 & 符号的评论以及如何将其写入连接字符串,谢谢【参考方案7】:

另一种方法是:

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) 
...

【讨论】:

听起来不错,但是我如何将它放入我的 grails-app 的 application.yml 中?【参考方案8】:

最近更改了启动与 MySQL 服务器的连接的默认值,并且(通过快速浏览有关堆栈溢出的最流行问题和答案)新值引起了很多混乱。更糟糕的是,标准建议似乎是完全禁用 SSL,这有点造成灾难。

现在,如果您的连接确实没有暴露在网络中(仅限本地主机),或者您在没有真实数据的非生产环境中工作,那么可以肯定:通过包含选项 useSSL=false 禁用 SSL 并没有什么害处.

对于其他所有人,需要以下一组选项才能使 SSL 与证书和主机验证一起使用:

使用SSL=true sslMode=VERIFY_IDENTITY trustCertificateKeyStoreUrl=file:path_to_keystore trustCertificateKeyStorePassword=password

作为额外的奖励,既然您已经在使用这些选项,那么禁用弱 SSL 协议也很简单:

启用 TLSProtocols=TLSv1.2

示例

因此,作为一个工作示例,您需要遵循以下广泛的步骤:

首先,确保您为 MySQL 服务器主机生成了有效的证书,并且 CA 证书已安装到客户端主机上(如果您使用自签名,那么您可能需要手动执行此操作,但对于流行的公共 CA,它已经存在了)。

接下来,确保 java 密钥库包含所有 CA 证书。在 Debian/Ubuntu 上,这是通过运行来实现的:

update-ca-certificates -f
chmod 644 /etc/ssl/certs/java/cacerts

最后,更新连接字符串以包含所有必需的选项,这在 Debian/Ubuntu 上有点像(根据需要调整):

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

参考:https://beansandanicechianti.blogspot.com/2019/11/mysql-ssl-configuration.html

【讨论】:

这不仅是正确的答案,而且也是最详细和最安全的。如果您收到有关 SSL 的警告,则永远不应跳过它(沙盒和本地安装除外)。您为我指出了连接到 Azure MySQL 的 Kubernetes Keycloack 9.0.2 集群的正确解决方案。非常感谢!【参考方案9】:

由于我目前处于开发模式,因此我将 useSSL 设置为 No 不是在 tomcat 中而是在 mysql 服务器配置中。从工作台转到管理访问设置\管理服务器连接-> 选择我的连接。内部连接选项卡转到 SSL 选项卡并禁用设置。为我工作。

【讨论】:

【参考方案10】:

解决方案 要修复它,请在 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

【讨论】:

【参考方案11】:

我在配置 xml 中将此属性用于休眠

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

没有 - serverTimezone=UTC - 它不起作用

【讨论】:

【参考方案12】:

我也发现了这个警告,然后我通过在连接字符串中使用 SSL=false 后缀来修复它,就像这个示例代码一样。

示例:

connectionString = "jdbc:mysql://server-name:3306/%s?useUnicode=yes&characterEncoding=UTF-8&useSSL=false"

【讨论】:

【参考方案13】:

在连接 MySQL 时使用它来解决 hive 中的问题

<property>
   <name>javax.jdo.option.ConnectionURL</name>
   <value>jdbc:mysql://localhost/metastore?createDatabaseIfNotExist=true&amp;autoReconnect=true&amp;useSSL=false</value>
   <description>metadata is stored in a MySQL server</description>
</property>

【讨论】:

但是为什么不使用 and 运算符呢?我有类似jdbc:mysql://localhost/metastore?useSSL=false&amp;createDatabaseIfNotExist=true 的东西。没有它,它工作正常。 对我来说,发布的值运行顺利,所以我将在 2017 年 12 月底将此标记为答案并使用 hive-2.1.1 hive-site.xml。 我在 hive-site.xml 中添加/替换了这个属性,它对我有用。【参考方案14】:

这对我来说没问题:

this.conn = (Connection)DriverManager
    .getConnection(url + dbName + "?useSSL=false", userName, password);

【讨论】:

【参考方案15】:

你需要像这样使用你的mysql路径:

<property name="url" value="jdbc:mysql://localhost:3306/world?useSSL=true"/>

【讨论】:

【参考方案16】:

如何使用 SSL 但关闭服务器验证(例如在您自己的计算机上处​​于开发模式时):

jdbc:mysql://localhost:3306/Peoples?verifyServerCertificate=false&useSSL=true

【讨论】:

这是我需要通过 IntelliJ / DataGrip 通过 SSL 连接到 MySQL 数据库【参考方案17】:

新版本mysql-connector默认建立SSL连接...解决:

下载旧版本的mysql-connector 如mysql-connector-java-5.0.8.zip

。 . 要么 . . 下载OpenSSL for Windows并按照说明进行设置

【讨论】:

【参考方案18】:

您的连接 URL 应如下所示,

jdbc:mysql://localhost:3306/Peoples?autoReconnect=true&useSSL=false

这将禁用 SSL 并抑制 SSL 错误。

【讨论】:

在 jdbc 连接字符串中不应以分号结尾 在tomcat上下文文件jdbc:mysql://localhost:3306/databaseName?autoReconnect=true;useSSL=false; 与分号的混淆可能是由于在 XML 配置中您需要将其设置为 ?autoReconnect=true&useSSL=false。否则解析器会认为你有一些奇怪的实体,你必须以';'结尾 我在休眠中遇到了同样的问题,但通过这样的 URL 解决了:jdbc:mysql://localhost:3306/Peoples?autoReconnect=true&amp;amp;useSSL=false 我使用 & 而不是 & @Roger 如果网络安全,有时会禁用 SSL。例如,我有运行在容器中的 SQL 服务器,这些容器只能由同一物理硬件上的客户端访问。

以上是关于连接到 MySQL 数据库时有关 SSL 连接的警告的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 SSL 的情况下连接到 MySQL 数据库

如何通过 SSL 连接到 Amazon RDS?

如何使用 PDO ssl 连接到 azure mysql 数据库

linux系统下c语言连接mysql数据库时有关mysql_error这个函数的返回值的问题,求知情人士

如何通过 SSL 上的 PHP 连接到 Amazon MySQL RDS 实例

Google DataStudio SSL 连接到 MariaDB