【问题标题】:Warning about SSL connection when connecting to MySQL database连接到 MySQL 数据库时有关 SSL 连接的警告
【发布时间】: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怎么样?
  • 这不是错误,而是警告。

标签: java ssl database-connection mysql-error-1064


【解决方案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 服务器,这些容器只能由同一物理硬件上的客户端访问。
                          猜你喜欢
                          • 1970-01-01
                          • 2012-04-28
                          • 1970-01-01
                          • 2011-05-18
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2012-05-28
                          相关资源
                          最近更新 更多