2团
Published on 2024-08-16 / 29 Visits
0
0

SpringBoot 3配置加密(TLS)访问MySQL

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文件夹下生成如下文件:

image-gycl.png

2.2 JDBC URL配置

首先将2.1章节生成的文件,放置于src/main/resources/mysql文件夹下,具体如下图所示:

image-sfhi.png

此后,应用配置文件参考下图进行配置(注意,需要将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加密。

image-fcbi.png

3. 参考文章

1.spring-boot-mysql-tls

2.配置 MySQL 使用加密连接


Comment