mysql使用jdbc连接增加ssl认证

mysql使用jdbc连接增加ssl认证

1.创建用户并指定ssl连接

grant all on . to 'imooc'@'%' identified by 'imooc require SSL;

2.查看是否使用ssl

SELECT ssl_type From mysql.user Where user="imooc"

3.配置用户必须使用ssl

ALTER USER 'imooc'@'%' REQUIRE SSL;
FLUSH PRIVILEGES;
注意:%号位置可以更换为连接数据库的ip

4.取消用户使用ssl连接

update user set ssl_type='' where user='imooc';
FLUSH PRIVILEGES;

5.导入证书

使用jdk自带的keytool导入mysql的客户端证书到密钥仓库,并生成密钥文件。
根据上文查到的ca.pem,将其复制到目标主机上,然后执行下述指令

keytool -import -trustcacerts -v -alias Mysql -file "C:\ProgramData\MySQL\MySQL Server 8.0\Data\ca.pem" -keystore "mysql.ks"
设置密钥并记住密钥

导入成功后

扩展:

#1: ObjectId: 2.5.29.19 Criticality=true //这里为true
BasicConstraints:[
  CA:true   							//这里为true
  PathLen:2147483647
]
注意:C:\ProgramData\MySQL\MySQL Server 8.0\Data\ca.pem为ca证书的路径,mysql

6.验证证书是否导入

keytool -list -keystore mysql.ks

导入成功后:

密钥库类型: jks
密钥库提供方: SUN

您的密钥库包含 1 个条目

mysql, 2022-2-23, trustedCertEntry,
证书指纹 (SHA1): CB:E2:5C:87:4E:93:62:8F:97:F9:7A:4B:0C:F3:6D:4D:63:DB:52:AB

7.将证书放在目标服务器或者http服务器,更改mysql驱动和连接配置

driverClassName=com.mysql.cj.jdbc.Driver

"jdbc:mysql://124.222.101.203:3306/imooc?useUnicode=true&useSSL=true&trustCertificateKeyStorePassword=123456&serverTimezone=Asia/Shanghai&trustCertificateKeyStoreUrl=http://localhost:8080/mysql.ks
注意:124.222.101.203为数据库服务器地址,trustCertificateKeyStorePassword=你设置的密钥,trustCertificateKeyStoreUrl=当前服务器可访问到证书的地址,useSSL=true,verifyServerCertificate=true代表需要客户端密钥库和信任库

8.数据库加密,客户端不使用证书

jdbc:mysql://124.222.101.203:3306/imooc?allowMultiQueries=true&useUnicode&characterEncoding=UTF-8&autoReconnect=true&useSSL=true&verifyServerCertificate=false&requireSSL=true",
注意:verifyServerCertificate=false不需要验证客户端密钥

9.数据库加密,客户端服务端双向验证(建立在数据库开启ssl认证并且生成服务端和客户端证书)

设置服务器身份验证:导入服务器证书
keytool -importcert -alias MySQLCACert -file ca.pem -keystore truststore.jks -storepass 123456

设置客户端身份验证:
将客户端密钥和证书文件转换为 PKCS #12 存档:(在数据库服务器生成)
openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -name "mysqlclient" -passout pass:123456 -out client-keystore.p12

将客户端密钥和证书导入 Java 密钥库:
keytool -importkeystore -srckeystore client-keystore.p12 -srcstoretype pkcs12 -srcstorepass 123456 -destkeystore keystore.jks -deststoretype JKS -deststorepass 123456

java数据库连接字符串:
"jdbc:mysql://124.222.101.203:3306/imooc?"
	+ "useSSL=true"
	+ "&verifyServerCertificate=true"
	+ "&requireSSL=true"
	+ "&trustCertificateKeyStoreUrl=file:D:/ssl.132/truststore.jks"
	+ "&trustCertificateKeyStorePassword=mypassword"
	+ "&clientCertificateKeyStoreUrl=file:D:/ssl.132/keystore.jks"
	+ "&clientCertificateKeyStorePassword=mypassword",
注意:123456为密码

10.导入jks证书

使用jdk自带的keytool导入mysql的客户端证书到密钥仓库,并生成密钥文件。
根据上文查到的ca.pem,将其复制到目标主机上,然后执行下述指令

keytool -importcert -alias MySQLCACert  -file ca.pem  -keystore truststore.jks   -storepass 123456   -noprompt
注意:123456为密码,ca.pem可替换为路径

11.验证证书是否导入

keytool -v -list -keystore truststore.jks  -storepass  "123456"

导入成功后:

密钥库类型: jks
密钥库提供方: SUN

您的密钥库包含 1 个条目

mysql, 2022-2-23, trustedCertEntry,
证书指纹 (SHA1): CB:E2:5C:87:4E:93:62:8F:97:F9:7A:4B:0C:F3:6D:4D:63:DB:52:AB

12.将证书放在目标服务器或者http服务器,更改mysql驱动和连接配置

注意:mysql连接驱动为mysql-connect-8.0.16以上版本,8.0.16以下版本使用ssl连接会出现日志报错问题,需升级解决
driverClassName=com.mysql.cj.jdbc.Driver

"jdbc:mysql://124.222.101.203:3306/imooc?useUnicode=true&useSSL=true&trustCertificateKeyStorePassword=123456&serverTimezone=Asia/Shanghai&trustCertificateKeyStoreUrl=http://localhost:8080/truststore.jks
注意:124.222.101.203为数据库服务器地址,trustCertificateKeyStorePassword=你设置的密钥,trustCertificateKeyStoreUrl=当前服务器可访问到证书的地址,useSSL=true,verifyServerCertificate=true代表需要客户端密钥库和信任库

13.useSSL=false和true的区别:

   SSL(Secure Sockets Layer 安全套接字协议),在mysql进行连接的时候,如果mysql的版本是5.7之后的版本必须要加上useSSL=false,mysql5.7以及之前的版本则不用进行添加useSSL=false,会默认为false,一般情况下都是使用useSSL=false,尤其是在将项目部署到linux上时,一定要使用useSSL=false!!!,useSSL=true是进行安全验证,一般通过证书或者令牌什么的,useSSL=false就是通过账号密码进行连接,通常使用useSSL=false!!!

14.附上jdbc连接mysql数据库的代码:

//mysql使用ssl方式jdbc连接数据库
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

/**
 * 标准JDBC操作五步骤
 */
public class StandardJDBCSample {
    public static void main(String[] args) {
        Connection conn = null;
        try {
            //1. 加载并注册JDBC驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2. 创建数据库连接
            conn = DriverManager.getConnection(
                    //无需证书:  "jdbc:mysql://124.222.101.203:3306/imooc?allowMultiQueries=true&useUnicode&characterEncoding=UTF-8&autoReconnect=true&useSSL=true&verifyServerCertificate=false&requireSSL=true",
                    //客户端证书 "jdbc:mysql://124.222.101.203:3306/imooc?useUnicode=true&useSSL=true&verifyServerCertificate=true&trustCertificateKeyStorePassword=123456&serverTimezone=Asia/Shanghai&trustCertificateKeyStoreUrl=http://localhost:8080/mysql.ks",
                    //客户端证书   "jdbc:mysql://124.222.101.203:3306/imooc?useUnicode=true&useSSL=true&verifyServerCertificate=true&trustCertificateKeyStorePassword=Truststore@123&serverTimezone=Asia/Shanghai&trustCertificateKeyStoreUrl=http://localhost:8080/truststore.jks",
                      "jdbc:mysql://124.222.101.203:3306/imooc?useUnicode=true&serverTimezone=Asia/Shanghai&useSSL=true",
                    "imooc", "imooc"
            );
            //3. 创建Statement对象
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("select * from employee where dname='市场部'");
            //4. 遍历查询结果
            while (rs.next()) {
                Integer eno = rs.getInt(1); //eno
                String ename = rs.getString("ename");
                Float salary = rs.getFloat("salary");
                String dname = rs.getString("dname");
                System.out.println(dname + "-" + eno + "-" + ename + "-" + salary);
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            try {
                if (conn != null && conn.isClosed() == false) {
                    //5. 关闭连接,释放资源
                    conn.close();
                }
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }

    }
}

15.数据库sql文件和jar包的链接:
链接:https://pan.baidu.com/s/1OmlrnE3ii58rtzdVl91Y7g
提取码:6yo2
需要联系博主

你可能感兴趣的:(网络安全)