当前位置: 代码网 > it编程>数据库>Mysql > JDBC如何通过SSL方式连接MySQL

JDBC如何通过SSL方式连接MySQL

2025年02月21日 Mysql 我要评论
环境说明mysql 版本mysql 5.7.26pom.xml<dependency> <groupid>mysql</groupid> <artif

环境说明

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服务器后的地址

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com