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


312

在下面的两个类中,我尝试连接到MySQL数据库。但是,我总是会收到此错误:

2015年12月09日星期三22:46:52警告:不建议在没有服务器身份验证的情况下建立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();
            }
        }
    }
}

2
感谢您的答复,确定,我只是不知道我需要在我的String connectionURL末尾添加ssl = true或false。
Milos86

谢谢,所以新的connectionURL怎么样?
user3290180 2015年

4
这不是错误,而是警告。
Fernando Silveira

Answers:


577

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

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

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


41
在jdbc连接字符串中不应该以半冒号结尾
Amith

8
在tomcat上下文文件jdbc:mysql:// localhost:3306 / databaseName?autoReconnect = true; useSSL = false;
Amith,2016年

27
与分号的混淆可能是由于以下事实:在XML配置中,您需要将其设置为?autoReconnect = true& useSSL = false。否则,解析器会认为您有一些以';'结尾的怪异实体
波士顿,2016年

25
我在休眠状态下遇到了同样的问题,但通过如下URL进行了解决: jdbc:mysql://localhost:3306/Peoples?autoReconnect=true&useSSL=false 我使用了& 代替
Saqib Ahmed

2
@Roger如果网络安全,有些情况下会禁用SSL。例如,我有运行在容器中的SQL Server,这些容器只能由相同物理硬件上的客户端访问。
罗德尼

131

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

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

这是我需要通过IntelliJ / DataGrip通过SSL连接到MySQL数据库的步骤
Swaraj

23

提及url如下:

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

但是在xml配置中,当您提到&符号时,IDE将显示以下错误:

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

然后,您必须显式使用&而不是&确定,&因为xml之后xml必须在xml配置中提供如下所示的url:

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

22

一种替代方法是:

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?
Fusca Software

12

我也找到了此警告,然后使用SSL = false后缀将其修复为连接字符串,例如此示例代码。

例:

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

11

用于初始化与MySQL服务器的连接的默认值在最近已更改,并且(通过快速查看堆栈溢出时最流行的问题和答案)新值引起了很多混乱。更糟糕的是,标准建议似乎是完全禁用SSL,这在制造过程中有点麻烦。

现在,如果您的连接确实没有暴露给网络(仅适用于本地主机),或者您正在没有真实数据的非生产环境中工作,那么请确保:通过包含option禁用SSL不会有任何危害useSSL=false

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

  • useSSL = true
  • sslMode = VERIFY_IDENTITY
  • trustCertificateKeyStoreUrl =文件:路径_密钥库
  • trustCertificateKeyStorePassword =密码

另外,看到您已经在使用这些选项,禁用弱SSL协议也很简单:

  • enabledTLSProtocols = 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群集的正确解决方案。非常感谢!
iakko

10

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

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

9

这对我来说还可以:

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

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>

但是为什么不使用and运算符呢?我有类似的东西jdbc:mysql://localhost/metastore?useSSL=false&createDatabaseIfNotExist=true。如果没有,则效果很好。
库拉桑加(Kulasangar)

对我而言,发布的值运行正常,因此我将在2017年12月底将此标记为答案,并使用hive-2.1.1 hive-site.xml。
ArifMustafa

7

我将此属性用于config xml中的休眠状态

<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


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.