java程序通过ssl连接mysql(windows环境)
环境:
OS:windows2012(mysql服务器)
mysql:5.7.29
jdk:1.8
说明:
mysql5.7版本安装会自动生成如下的证书文件(可以用不自己再生成ca文件):
ca.pem
client-cert.pem
client-key.pem
同时mysql是默认开启了ssl了的
keytool只使用到ca.pem文件,但是navicate工具这三个文件都会用到.
1.进入到ca.pem的目录(将mysql服务器生成的文件根据自己情况下载到相应的目录)
C:\Users\Administrator>cd c:/
c:\>cd win2012_mysql_ca
c:\win2012_mysql_ca>dir
驱动器 C 中的卷是 OS
卷的序列号是 8AB0-84EC
c:\win2012_mysql_ca 的目录
2023/10/30 15:38 <DIR> .
2023/10/30 15:38 <DIR> ..
2023/10/30 10:07 1,707 ca-key.pem
2023/10/30 10:07 1,131 ca.pem
2023/10/30 10:07 1,131 client-cert.pem
2023/10/30 10:07 1,703 client-key.
2.生成证书(前提需要安装好jdk,keytool是jdk自带的)
c:\win2012_mysql_ca>keytool -importcert -alias MySQLCACert -file ca.pem -keystore truststore -storepass 123456
所有者: CN=MySQL_Server_5.7.29_Auto_Generated_CA_Certificate
发布者: CN=MySQL_Server_5.7.29_Auto_Generated_CA_Certificate
序列号: 1
有效期为 Mon Oct 30 10:07:33 CST 2023 至 Thu Oct 27 10:07:33 CST 2033
证书指纹:
MD5: 41:B2:EC:07:5A:9C:99:54:5D:43:99:BE:93:F1:19:78
SHA1: 32:60:1C:73:FB:1F:A7:06:D5:1C:57:B9:F7:39:94:DE:8D:C6:46:23
SHA256: E9:F9:AF:68:42:8A:7B:13:F2:E3:8E:36:60:19:2F:DE:EB:E5:90:62:5F:FC:7B:4E:94:50:47:74:61:58:B2:4A
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.19 Criticality=true
BasicConstraints:[
CA:true
PathLen:2147483647
]
是否信任此证书? [否]: y
证书已添加到密钥库中
这里设置的密码是123456,后面的jdbc连接需要用到这个密码
3.这个时候会生成一个文件truststore
c:\win2012_mysql_ca>dir
驱动器 C 中的卷是 OS
卷的序列号是 8AB0-84EC
c:\win2012_mysql_ca 的目录
2023/10/30 15:38 <DIR> .
2023/10/30 15:38 <DIR> ..
2023/10/30 10:07 1,707 ca-key.pem
2023/10/30 10:07 1,131 ca.pem
2023/10/30 10:07 1,131 client-cert.pem
2023/10/30 10:07 1,703 client-key.pem
2023/10/30 15:38 846 truststore
5 个文件 6,518 字节
2 个目录 11,266,293,760 可用字节
若想修改密码,可以删除该文件使用新的密码重新执行keytool重新生成。
4.成之后可以查看一下是否生成成功,操作命令
c:\win2012_mysql_ca>keytool -list -keystore truststore
输入密钥库口令: ##这里输入123456
密钥库类型: jks
密钥库提供方: SUN
您的密钥库包含 1 个条目
mysqlcacert, 2023-10-30, trustedCertEntry,
证书指纹 (SHA1): 32:60:1C:73:FB:1F:A7:06:D5:1C:57:B9:F7:39:94:DE:8D:C6:46:23
5.java数据库连接
datasource.masterUrl=jdbc:mysql://192.168.1.105:3306/db_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&verifyServerCertificate=true&requireSSL=true&sslMode=verify_ca&trustCertificateKeyStoreUrl=file:C:/win2012_mysql_ca/truststore&trustCertificateKeyStorePassword=123456
需要提前创建好用户
grant all privileges on *.* to 'ssltest'@'%' identified by 'mysql' require ssl;
完整的代码如下:
package ssltest;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class mytest {
Connection con;
public static String user;
public static String password;
public void getConnection() {
try {
Class.forName("com.mysql.jdbc.Driver");
System.out.println("数据库驱动加载成功");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
user = "ssltest";
password = "mysql"; // 填自己的密码
try {
//con = DriverManager.getConnection("jdbc:mysql://192.168.1.105:13306/db_test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=true", user, password);
con = DriverManager.getConnection("jdbc:mysql://192.168.1.105:13306/db_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&verifyServerCertificate=true&requireSSL=true&sslMode=verify_ca&trustCertificateKeyStoreUrl=file:C:/win2012_mysql_ca/truststore&trustCertificateKeyStorePassword=123456", user, password);
System.out.println("数据库连接成功");
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
mytest c = new mytest();
c.getConnection();
}
}
说明:我这里用到的mysql驱动是5.1.49版本