环境说明
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服务器后的地址
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论