java程序通过ssl连接mysql(windows环境)

发布时间 2023-10-30 16:26:30作者: slnngk

环境:
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

 

完整的代码如下:

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版本