1. 前言
前序开发项目,因为没有合适的主机资源,将MySQL通过Docker形式部署在云主机上,并通过Nginx反向代理暴露于公网上。为了浅浅的保障一下MySQL以及主机安全,因此配置MySQL仅允许通过加密连接进行访问,具体配置可参考《MySQL 8.4的Docker compose设置自动生成SSL以及RSA文件并启用加密连接》一文。
已知MySQL在完成加密配置,初次启动后生成SSL以及RSA相关文件,具体如下:
ca.pem:证书颁发机构 (CA) 证书文件;
server-cert.pem:服务器公钥证书文件;
server-key.pem:服务器私钥文件;
client-cert.pem:客户端公钥证书文件;
client-key.pem:客户端私钥文件。
2. 配置TLS参数
2.1 证书格式转换
Java无法直接使用MySQL生成的证书文件(ca.pem、client-cert.pem以及client-key.pem),因此需要基于keystore工具,将文件转换为Java能识别的JKS格式。
从Java 9开始,默认的keystore格式为PKCS12。
具体转换参见下文脚本:
#!/bin/bash
mkdir -p ./certs
# 需要注意,请将YOURPASSWORD字段替换为实际密码!
# 需要注意,请将YOURPASSWORD字段替换为实际密码!
# 需要注意,请将YOURPASSWORD字段替换为实际密码!
keytool -importcert -alias MySQLCACert.jks -file ./ca.pem \
-keystore ./certs/truststore.jks -storepass YOURPASSWORD
openssl pkcs12 -export -in ./client-cert.pem -inkey ./client-key.pem \
-out ./certs/certificate.p12 -name "certificate"
keytool -importkeystore -srckeystore ./certs/certificate.p12 -srcstoretype pkcs12 -destkeystore ./certs/client-cert.jks
执行脚本后,会在certs文件夹下生成如下文件:
2.2 JDBC URL配置
首先将2.1章节生成的文件,放置于src/main/resources/mysql
文件夹下,具体如下图所示:
此后,应用配置文件参考下图进行配置(注意,需要将YOURPASSWORD替换为2.1章节使用的密码)。
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: >-
jdbc:mysql://**.**.**.**:3306/xxxxxxxx?
useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&
useSSL=true&verifyServerCertificate=true&
trustCertificateKeyStoreUrl=classpath:mysql/truststore.jks&
trustCertificateKeyStorePassword=YOURPASSWORD&
clientCertificateKeyStoreUrl=classpath:mysql/client-cert.jks&
clientCertificateKeyStorePassword=YOURPASSWORD
username: root
password: '!***********!'
通过如上配置,SpringBoot应用即可基于TLS加密连接访问MySQL。
2.3 连接验证
为验证连接是通过TLS连接访问,可执行如下SQL语句查询(为方便,当前数据库连接使用的是root账户,若使用其他账户访问MySQL,请自行替换):
SELECT
process.thd_id,
user,
db,
ssl_version,
ssl_cipher
FROM
sys.processlist process,
sys.session_ssl_status session
where
user like '%root%'
执行结果如下图所示,通过查询结果可知,当前连接基于TLSv1.3加密。