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

Mil*_*s86 293 java ssl database-connection mysql-error-1064

通过以下两个类,我尝试连接到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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是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();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 546

您的连接网址应如下所示,

jdbc:mysql://localhost:3306/Peoples?autoReconnect=true&useSSL=false
Run Code Online (Sandbox Code Playgroud)

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

  • 在jdbc连接字符串中应该不以半冒号结尾 (37认同)
  • 分号的混淆可能是因为在XML配置中你需要将它作为?autoReconnect = true& useSSL = false.否则,解析器认为你有一些奇怪的实体,你必须用';'结束 (26认同)
  • 我在hibernate中遇到了同样的问题但是通过URL解决了这样的问题:`jdbc:mysql:// localhost:3306/Peoples?autoReconnect = true& useSSL = false`我使用**&**而不是**&** (23认同)
  • 在tomcat上下文文件中jdbc:mysql:// localhost:3306/databaseName?autoReconnect = true; useSSL = false; (7认同)
  • 禁用SSL听起来不是一个好主意。 (5认同)
  • @Rogerthat 如果网络安全,有些情况下会禁用 SSL。例如,我在容器中运行 SQL 服务器,只能由相同物理硬件上的客户端访问。 (2认同)

Pet*_*rio 128

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

jdbc:mysql://localhost:3306/Peoples?verifyServerCertificate=false&useSSL=true
Run Code Online (Sandbox Code Playgroud)

  • 这就是我通过 IntelliJ / DataGrip 通过 SSL 连接到 MySQL 数据库所需要做的事情 (2认同)

小智 25

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

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

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

  • 使用SSL=真
  • sslMode=VERIFY_IDENTITY
  • trustCertificateKeyStoreUrl=file:path_to_keystore
  • trustCertificateKeyStorePassword=密码

作为一个额外的好处,看到您已经在使用这些选项,禁用弱 SSL 协议也很简单:

  • enabledTLSProtocols=TLSv1.2

例子

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

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

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

update-ca-certificates -f
chmod 644 /etc/ssl/certs/java/cacerts
Run Code Online (Sandbox Code Playgroud)

最后,更新连接字符串以包含所有必需的选项,这在 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
Run Code Online (Sandbox Code Playgroud)

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

  • 这不仅是正确的答案,而且也是最详细、最安全的答案。如果您收到有关 SSL 的警告,切勿跳过它(沙箱和本地安装除外)。您向我指出了连接到 Azure MySQL 的 Kubernetes Keycloack 9.0.2 集群的正确解决方案。多谢! (3认同)

Ari*_*afa 22

提到的url样子:

jdbc:mysql://hostname:3306/hibernatedb?autoReconnect=true&useSSL=false
Run Code Online (Sandbox Code Playgroud)

但是当您提及&签名时,在xml配置中,IDE会显示以下错误:

The reference to entity "useSSL" must end with the ';' delimiter.
Run Code Online (Sandbox Code Playgroud)

然后你必须明确地使用&,而不是&被确定为&通过xml其后xml你得给在这样的xml配置的网址:

<property name="connection.url">jdbc:mysql://hostname:3306/hibernatedb?autoReconnect=true&amp;useSSL=false</property>
Run Code Online (Sandbox Code Playgroud)


Jon*_*Jon 21

另一种方法是:

Properties properties = new Properties();
properties.setProperty("user", "root");
properties.setProperty("password", "milos23);
properties.setProperty("useSSL", "false");
properties.setProperty("autoReconnect", "true");

try (Connection conn = DriverManager.getConnection(connectionUrl, properties)) {
...
} catch (SQLException e) {
...
}
Run Code Online (Sandbox Code Playgroud)

虽然,我不认为需要自动重新连接设置来删除警告.

  • 没错,不需要`autoReconnect` (6认同)

Kha*_*aen 11

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

例:

connectionString = "jdbc:mysql://{server-name}:3306/%s?useUnicode=yes&characterEncoding=UTF-8&useSSL=false"
Run Code Online (Sandbox Code Playgroud)


小智 10

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

<property name="url" value="jdbc:mysql://localhost:3306/world?useSSL=true"/>
Run Code Online (Sandbox Code Playgroud)


KAR*_*N.A 9

在与MySQL建立连接时使用它来解决配置单元中的问题

<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>
Run Code Online (Sandbox Code Playgroud)


小智 9

要在 Java 连接到数据库时禁用警告,请使用以下概念 \xe2\x88\x92

\n
autoReconnect=true&useSSL=false\n
Run Code Online (Sandbox Code Playgroud)\n

只需要更改connectionURL,例如:

\n
String connectionURL = jdbc:mysql://localhost:3306/Peoples?autoReconnect=true&useSSL=false\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n


小智 8

这对我来说没问题:

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


Ali*_*nka 7

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

<property name="hibernate.connection.url">
jdbc:mysql://localhost:3306/bookshop?serverTimezone=UTC&amp;useSSL=false
</property>
Run Code Online (Sandbox Code Playgroud)

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