mysql数据库使用useSSL=true,并配置ca证书和密钥连接

参考:Mysql5.7开启SSL并且支持Springboot客户端验证
https://blog.csdn.net/weixin_42911645/article/details/127070812

前提:已安装好数据库,这里以mysql5.7为例

一、配置mysql服务器

  1. 确认数据库目录位置,可以输入以下指令查看:
show variables like 'datadir';

在这里插入图片描述
数据库安装好后,在数据库目录下存在默认生成好的证书文件:
ca.pemca-key.pemclient-cert.pemclient-key.pemserver-cert.pemserver-key.pem
如果没有以上文件,需要手工生成,-> 【制作证书】

  1. 修改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"
  1. 重启mysql服务,检查数据库ssl是否开启状态,have_openssl 与 have_ssl 值都为YES表示ssl开启成功
show variables like '%ssl%';
show variables like 'have%ssl%';
  1. 通过客户端密钥与证书ssl+密码连接测试,并查看属性
    指定证书文件位置client-cert.pemclient-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行:

# 1.未使用
mysql> \s
...
SSL: Not in use
...
 
 # 2.已使用
mysql> \s
...
SSL: Cipher in use is DHE-RSA-AES128-GCM-SHA256  
...

二、JAVA客户端连接数据库

  1. 找服务端提供三个原始文件
    在这里插入图片描述
    在原始文件目录下,依次执行以下指令,生成keystoremysqltruststoremysql 文件。
    可自行修改密码,默认是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:

#!/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 "========================="
  1. 使用目标文件keystoremysqltruststoremysql和密码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}

猜你喜欢

转载自blog.csdn.net/u014438244/article/details/127699992