连接MySQL数据库时出现SSL连接警告

使用下面的两个类,我尝试连接到一个MySQL数据库。然而,我总是得到这个错误:

星期三12月09 22:46:52 CET 2015警告:不建议在没有服务器身份验证的情况下建立SSL连接。根据MySQL 5.5.45+、5.6.26+和5.7.6+的要求,如果没有设置explicit option,默认必须建立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();
}
}
}
}
563738 次浏览

您的连接URL应该如下所示,

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

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

另一种方法是:

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

新版本的mysql-connector默认建立SSL连接…解决方法:

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

< p >。 . 或 . . 下载OpenSSL for Windows并按照说明设置它

解决hive中连接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>

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

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

这对我来说还行:

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

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

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

像这样提到url:

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

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

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

然后你必须显式地使用&amp;而不是&来被xml确定为&,然后在xml中,你必须像这样在xml配置中给出url:

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

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

例子:

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

我在配置xml中为hibernate使用了这个属性

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

without - serverTimezone = UTC -它不起作用

< p >解决方案 要解决这个问题,在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

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

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

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

对于其他人,需要以下一组选项来让SSL与证书和主机验证一起工作:

  • useSSL = true
  • sslMode = VERIFY_IDENTITY
  • trustCertificateKeyStoreUrl =文件: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

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

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

autoReconnect=true&useSSL=false

只需要像这样更改connectionURL:

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

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

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

请更新mysql连接器。那会有帮助的。

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

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

在JDK 11中建立DB连接时,我们必须显式地提到TLS协议的类型。

简单使用平台独立zip或tar https://dev.mysql.com/downloads/connector/j/?os=26 < / p >

自8.0.13起,useSSL参数现在已弃用,你应该使用sslMode:

MySQL:: MySQL Connector/J 8.0 Developer Guide:: 6.3.5 Security .0

sslMode

默认情况下,网络连接是SSL加密的;这个属性 允许关闭安全连接或不同级别的 安全性有待选择。允许使用以下值:"DISABLED"- 建立未加密的连接;“PREFERRED"—(默认)建立 如果服务器启用了加密连接,则加密连接,否则退回 到未加密的连接;“REQUIRED"-建立安全连接 如果服务器启用了它们,则失败;“VERIFY_CA"——就像 “REQUIRED"但是还要验证服务器TLS证书 已配置的证书颁发机构(CA)证书; “VERIFY_IDENTITY"-喜欢“VERIFY_CA",但另外验证 服务器证书与连接的主机匹配 尝试。< / p >

此属性替换了弃用的遗留属性"useSSL" “requireSSL"”和“verifyServerCertificate"”,仍然被接受 而是转换成一个值为“;sslMode"如果“sslMode"不是 明确设置:"useSSL=false"

未知宏:{"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"注意,对于ALL服务器 版本,默认设置的&;sslMode"是“preferred”,它是 相当于“useSSL=true”的遗留设置, “requireSSL=false”,“verifyServerCertificate=false” 不同于Connector/J 8.0.12的默认设置 在某些情况下更早。类型的应用程序 遗留属性和依赖旧的默认设置应该 回顾。< / p >

遗留属性被忽略如果"sslMode"显式设置。如果 没有&;sslMode"或“;useSSL"是否显式设置为默认设置 的“sslMode = PREFERRED"适用。< / p >

默认值PREFERRED从Version 8.0.13开始