Caused by: java.io.EOFException: SSL peer shut down incorrectly
在java里面连接mysql5.7.17数据库,报以上错误,
将数据库升级到mysql5.7.44就可以了。
这两天处理java连接mysql的问题,报了各种错误,总结一下就是openssl和mysql的版本都不对,
经过实测:
JDK版本: 1.8 其他版本没试过。
openssl 版本 1.1.1 ,下载地址: OPENSSL 1.1.1
mysql版本 5.7.44(我测试的mysql 5.7.17不行,如果在5.7.17上报错的同学,请及时升级mysql版本到5.7.44)
以下介绍详细步骤
-
按照响应版本的openssl 版本 1.1.1 和mysql 版本 5.7.44
-
安装好了openssl和mysql相应版本之后,执行以下命令生成证书
cd D:\soft\new\mysql5.7\bin\
mysql_ssl_rsa_setup.exe --datadir=D:\\cert
会生成这几个文件
- 将 PEM 证书转换为 JKS:
你可以使用 Java 的 keytool 工具将 .pem 证书导入 .jks 文件中。
keytool -importcert -file client-cert.pem -keystore client-keystore.jks -alias mysqlclientkeytool -importcert -file ca.pem -keystore truststore.jks -alias mysqlca
- 配置数据库mysql的配置文件 my.ini
[client]
ssl-ca=D:\\cert\\ca.pem
ssl-cert=D:\\cert\\client-cert.pem
ssl-key=D:\\cert\\client-key.pem[mysqld]
#服务器CA证书
ssl-ca=D:\\cert\\ca.pem
#服务端使用的证书
ssl-cert=D:\\cert\\server-cert.pem
#服务端使用的密钥
ssl-key=D:\\cert\\server-key.pem
- java连接测试。
package org.example;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class TestDb {Connection con;public static String user;public static String password;public void getConnection() {try {Class.forName("com.mysql.cj.jdbc.Driver");System.out.println("数据库驱动加载成功");} catch (ClassNotFoundException e) {e.printStackTrace();}user = "test";password = "123456"; // 填自己的密码try {con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3309/sakila?" +"allowMultiQueries=true&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&" +"useSSL=true&" +"sslMode=VERIFY_CA&" +"verifyServerCertificate=true&" +"requireSSL=true&" +"clientCertificateKeyStoreUrl=file:D:\\cert\\client-keystore.jks&clientCertificateKeyStorePassword=123456&" +
"trustCertificateKeyStoreUrl=file:D:\\cert\\truststore.jks&trustCertificateKeyStorePassword=123456", user, password);System.out.println("数据库连接成功");} catch (SQLException e) {e.printStackTrace();}}public static void main(String[] args) {TestDb c = new TestDb();c.getConnection();}
}