参考:Mysql5.7开启SSL并且支持Springboot客户端验证
https://blog.csdn.net/weixin_42911645/article/details/127070812
前提:已安装好数据库,这里以mysql5.7为例
一、配置mysql服务器
- 确认数据库目录位置,可以输入以下指令查看:
show variables like 'datadir';
数据库安装好后,在数据库目录下存在默认生成好的证书文件:ca.pem
、ca-key.pem
、client-cert.pem
、client-key.pem
、server-cert.pem
、server-key.pem
如果没有以上文件,需要手工生成,-> 【制作证书】
- 修改mysql配置文件,添加ssl调用配置
[client]
ssl-cert = "C:/ProgramData/MySQL/MySQL Server 5.7/Data/client-cert.pem"
ssl-key = "C:/ProgramData/MySQL/MySQL Server 5.7/Data/client-key.pem"
注意:如果是做了主从,需要把主的证书拷贝到从
[mysqld]
ssl-ca="C:/ProgramData/MySQL/MySQL Server 5.7/Data/ca.pem"
ssl-cert="C:/ProgramData/MySQL/MySQL Server 5.7/Data/server-cert.pem"
ssl-key="C:/ProgramData/MySQL/MySQL Server 5.7/Data/server-key.pem"
- 重启mysql服务,检查数据库ssl是否开启状态,have_openssl 与 have_ssl 值都为YES表示ssl开启成功
show variables like '%ssl%';
show variables like 'have%ssl%';
- 通过客户端密钥与证书ssl+密码连接测试,并查看属性
指定证书文件位置client-cert.pem
、client-key.pem
。
mysql -uroot -proot -h 127.0.0.1 -P 13306 --ssl-cert=D:/server/config/client-cert.pem --ssl-key=D:/server/config/client-key.pem
要确定当前与服务器的连接是否使用加密,请检查Ssl_cipher状态变量的会话值 。如果该值为空,则连接未加密。否则,连接被加密并且该值指示加密密码。例如:
mysql> SHOW SESSION STATUS LIKE 'Ssl_cipher';
+---------------+---------------------------+
| Variable_name | Value |
+---------------+---------------------------+
| Ssl_cipher | DHE-RSA-AES128-GCM-SHA256 |
+---------------+---------------------------+
对于mysql客户端,另一种方法是使用STATUSor\s 命令并检查该SSL行:文章来源:https://www.toymoban.com/news/detail-403260.html
# 1.未使用
mysql> \s
...
SSL: Not in use
...
# 2.已使用
mysql> \s
...
SSL: Cipher in use is DHE-RSA-AES128-GCM-SHA256
...
二、JAVA客户端连接数据库
- 找服务端提供三个原始文件
在原始文件目录下,依次执行以下指令,生成keystoremysql
、truststoremysql
文件。
可自行修改密码,默认是123456
1. 生成truststore文件
keytool -importcert -alias Cacert -file ca.pem -keystore truststoremysql -storepass 123456
2. 生成中间文件
openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -name "mysqlclient" -passout pass:123456 -out client-keystore.p12
3. 生成keystore文件
keytool -importkeystore -srckeystore client-keystore.p12 -srcstoretype pkcs12 -srcstorepass 123456 -destkeystore keystoremysql -deststoretype JKS -deststorepass 123456
以上两个文件生成的参数可以自己修改,windows环境中没有openssl,在linux环境中执行。密码注意自行更改为统一的值,后续配置要用到
生成结果:
另:
为了方便,已经将上述指令封装为脚本:
create.sh:文章来源地址https://www.toymoban.com/news/detail-403260.html
#!/bin/bash
passwd=$1
outpath=$(pwd)/out
echo "outpath: ${outpath}"
if [ -z "$passwd" ];then
echo '密码不能为空,使用示例:./create 123456'
exit 0
fi
rm -rf $outpath
if [ ! -d $outpath ];then
mkdir $outpath
fi
echo '1【生成truststore文件...】'
keytool -importcert -alias Cacert -file ca.pem -keystore ${outpath}/truststoremysql -storepass ${passwd}
echo '2【生成中间文件...】'
openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -name "mysqlclient" -passout pass:${passwd} -out ${outpath}/client-keystore.p12
echo '3【生成keystore文件...】'
keytool -importkeystore -srckeystore ${outpath}/client-keystore.p12 -srcstoretype pkcs12 -srcstorepass ${passwd} -destkeystore ${outpath}/keystoremysql -deststoretype JKS -deststorepass ${passwd}
echo " "
echo "=======文件生成成功======"
echo "请拷贝目录${outpath}下的 truststoremysql 和 keystoremysql 文件"
echo "========================="
- 使用目标文件
keystoremysql
、truststoremysql
和密码123456
进行客户端链接
以下为spring配置文件application.properties示例:
# 目标文件目录(keystoremysql、truststoremysql)
ssl.cert.path=C:\\Users\\cmc\\Desktop
# 生成目标文件时填写的密码
ssl.password=123456
ssl.config=useSSL=true&verifyServerCertificate=true&requireSSL=true&clientCertificateKeyStoreUrl=file:${ssl.cert.path}/keystoremysql&clientCertificateKeyStorePassword=${ssl.password}&trustCertificateKeyStoreUrl=file:${ssl.cert.path}/truststoremysql&trustCertificateKeyStorePassword=${ssl.password}
# datasource配置:
spring.datasource.master.url=jdbc:mysql://127.0.0.1:13306/db1?nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8&${ssl.config}
到了这里,关于mysql数据库使用useSSL=true,并配置ca证书和密钥连接的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!