JDBC如何通过SSL方式连接MySQL

 更新时间:2025年02月21日 10:19:33   作者:不会画画的画师  
文章介绍了如何配置MySQL以支持SSL连接,并通过JDBC进行安全连接,主要内容包括查看MySQL SSL支持、创建SSL连接用户、配置用户是否强制使用SSL、JDBC配置导入证书以及使用Go编写一个简单的HTTP文件服务器来提供SSL证书

环境说明

MySQL 版本

  • MySQL 5.7.26

pom.xml

<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>8.0.18</version>
</dependency>

JDK版本

  • JDK 1.8

MySQL配置SSL

查看MySQL是否支持SSL连接

  • 查看MySQL是否支持SSL
SHOW VARIABLES LIKE 'have_ssl'

如果hava_ssl对应的值为YES则支持SSL

  • 查询ssl证书地址
show variables like '%ssl%';

ssl_ca对应的就是ssl证书名

创建SSL连接用户

  • 创建用户
CREATE USER 'ssler'@'%' IDENTIFIED BY '123456';
GRANT ALL ON *.* TO 'ssler'@'%'
  • 查看用户是否使用ssl
SELECT ssl_type From mysql.user Where user="ssler"

截图中ssl_type为空字符串,表示该用户不强制要求使用ssl连接。

  • 配置用户必须使用ssl连接
ALTER USER 'ssler'@'%' REQUIRE SSL;
FLUSH PRIVILEGES

此时再执行

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

ANY表示必须使用ssl连接。

JDBC配置

导入证书

  • 使用jdk自带的keytool导入mysql的客户端证书到密钥仓库,并生成密钥文件。
  • 根据上文查到的ca.pem,将其复制到目标主机上,然后执行下述指令
$ keytool -import -trustcacerts -v -alias Mysql -file ca.pem -keystore "mysql.ks"
输入密钥库口令:
再次输入新口令:
所有者: CN=MySQL_Server_5.7.26_Auto_Generated_CA_Certificate
发布者: CN=MySQL_Server_5.7.26_Auto_Generated_CA_Certificate
序列号: 1
有效期为 Wed Apr 29 16:32:45 CST 2020 至 Sat Apr 27 16:32:45 CST 2030
证书指纹:
         MD5:  09:E7:41:84:08:B0:70:5F:AC:D6:03:61:CE:F4:50:DE
         SHA1: 6B:EE:FE:B4:74:89:A3:88:6C:49:22:44:6D:FB:88:DE:18:6A:7A:F6
         SHA256: 83:DD:8F:83:71:08:1D:36:D6:C0:2B:23:D2:E9:DC:84:0E:D6:ED:9A:E5:85:DF:7C:7C:52:33:9A:D7:83:0F:29
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3

扩展:

#1: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
  CA:true
  PathLen:2147483647
]

是否信任此证书? [否]:  y
证书已添加到密钥库中
[正在存储mysql.ks]

通过指令验证证书是否导入:

$ keytool -list -keystore mysql.ks
输入密钥库口令:
密钥库类型: jks
密钥库提供方: SUN

您的密钥库包含 1 个条目

mysql, 2020-6-9, trustedCertEntry,
证书指纹 (SHA1): 6B:EE:FE:B4:74:89:A3:88:6C:49:22:44:6D:FB:88:DE:18:6A:7A:F6

将证书放在目标服务器上

在密钥仓库文件生成的文件夹下,配置http服务器。

此处使用go写一个http文件服务器:

package main

import "net/http"

func main()  {
	http.Handle("/", http.FileServer(http.Dir(".")))
	http.ListenAndServe(":9999", nil)
}

将编译后的go程序放在与mysql.ks同一目录下,并启动即可

编写JDBC代码

public class JDBCMySQL {

    public static void main(String[] args) {
        Connection connection = null;
        String urlWithCe = "jdbc:mysql://192.168.254.82:13306/cloud?" +
                "useSSL=true&trustCertificateKeyStorePassword=123456&" +
                "trustCertificateKeyStoreUrl=http://localhost:9999/mysql.ks&" +
                "allowMultiQueries=true&" +
                "useUnicode&characterEncoding=UTF-8&" +
                "verifyServerCertificate=false&requireSSL=true";
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            connection = DriverManager.getConnection(urlWithCe,
                    "ssler", "123456");
            PreparedStatement preparedStatement = connection.prepareStatement("select * from " +
                    "cm_user");
            System.out.println(preparedStatement.executeQuery().first());
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
}
  • trustCertificateKeyStorePassword=123456为密钥仓库的密码,在生成密钥仓库文件时配置;
  • trustCertificateKeyStoreUrl=http://localhost:9999/mysql.ks为证书放置在http服务器后的地址

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MyBatis如何使用PageHelper实现分页查询

    MyBatis如何使用PageHelper实现分页查询

    这篇文章主要介绍了MyBatis如何使用PageHelper实现分页查询,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • SpringBoot开发实战系列之动态定时任务

    SpringBoot开发实战系列之动态定时任务

    在我们日常的开发中,很多时候,定时任务都不是写死的,而是写到数据库中,从而实现定时任务的动态配置,下面这篇文章主要给大家介绍了关于SpringBoot开发实战系列之动态定时任务的相关资料,需要的朋友可以参考下
    2021-08-08
  • 详解SpringBoot中如何使用Reactor模型

    详解SpringBoot中如何使用Reactor模型

    Reactor模型主要提供了一种在Java虚拟机上构建非阻塞应用的方式,这种方式使用了响应式编程原理,通过响应式流标准来实现,下面我们就来看看它在SpringBoot中是如何使用的吧
    2024-04-04
  • 一篇文章带你搞定JAVA内存泄漏

    一篇文章带你搞定JAVA内存泄漏

    今天小编就为大家分享一篇关于Java内存泄漏问题处理方法经验总结,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2021-07-07
  • Spring controller校验入参的方法详解

    Spring controller校验入参的方法详解

    项目中使用Springboot,在Controller中配置了@NotNull和@Valid,@Notnull不生效,@Valid生效,返回http status为400,本文给大家介绍了Spring controller校验入参的方法,需要的朋友可以参考下
    2024-06-06
  • java多线程实现同步锁卖票实战项目

    java多线程实现同步锁卖票实战项目

    本文主要介绍了java多线程实现同步锁卖票实战项目,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • Java的DelayQueue延迟队列简单使用代码实例

    Java的DelayQueue延迟队列简单使用代码实例

    这篇文章主要介绍了Java的DelayQueue延迟队列简单使用代码实例,DelayQueue是一个延迟队列,插入队列的数据只有达到设置的延迟时间时才能被取出,否则线程会被阻塞,插入队列的对象必须实现Delayed接口,需要的朋友可以参考下
    2023-12-12
  • Java中的CountDownLatch、CyclicBarrier和semaphore实现原理解读

    Java中的CountDownLatch、CyclicBarrier和semaphore实现原理解读

    这篇文章主要介绍了Java中的CountDownLatch、CyclicBarrier和semaphore实现原理详解,CountDownLatch中调用await方法线程需要等待所有调用countDown方法的线程执行,这就很适合一个业务需要一些准备条件,等准备条件准备好之后再继续执行,需要的朋友可以参考下
    2023-12-12
  • Java 注解学习笔记

    Java 注解学习笔记

    一直都在使用注解,但是一直都没有用的很明白,后来被逼的发现不搞明白真的就没有办法愉快的写代码了,所以,这篇《Java中的注解学习笔记》就呼之欲出了
    2020-10-10
  • MyBatis如何调用存储过程与存储函数

    MyBatis如何调用存储过程与存储函数

    这篇文章主要介绍了MyBatis如何调用存储过程与存储函数,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论