连接到 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.html、sslModel
属性替换了已弃用的旧属性useSSL
、requireSSL
和verifyServerCertificate
。所以,你可以使用连接字符串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&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&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&autoReconnect=true&useSSL=false</value>
<description>metadata is stored in a MySQL server</description>
</property>
【讨论】:
但是为什么不使用 and 运算符呢?我有类似jdbc:mysql://localhost/metastore?useSSL=false&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;useSSL=false
我使用 & 而不是 &
@Roger 如果网络安全,有时会禁用 SSL。例如,我有运行在容器中的 SQL 服务器,这些容器只能由同一物理硬件上的客户端访问。以上是关于连接到 MySQL 数据库时有关 SSL 连接的警告的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 PDO ssl 连接到 azure mysql 数据库
linux系统下c语言连接mysql数据库时有关mysql_error这个函数的返回值的问题,求知情人士