适用:SpringBoot 2.x/ 3.x,HikariCP 默认连接池;示例以 OpenGauss 为主,MySQL/PostgreSQL 只需要修改驱动类与连接串参数。 安全要点:密码不从配置文件明文写死、强制 SSL 证书校验、连接池安全参数、关闭敏感日志
1. pom.xml 依赖
<!-- SpringBoot JDBC Starter(自带HikariCP) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- OpenGauss JDBC驱动,如果是MySQL替换成mysql-connector-j -->
<dependency>
<groupId>org.opengauss</groupId>
<artifactId>opengauss-jdbc</artifactId>
<version>5.0.0</version>
</dependency>
2. application.yml(核心配置)
spring:
datasource:
# 数据库连接地址,开启SSL+完整证书校验
url: jdbc:opengauss://10.0.0.10:5432/mydb?ssl=true&sslmode=verify-full&sslrootcert=/opt/dbca/root.crt
driver-class-name: org.opengauss.Driver
# 用户名、密码从环境变量读取,不要写死!
username: ${DB_USER}
password: ${DB_PWD}
# HikariCP 安全调优配置
hikari:
# 连接池名称,方便日志排查
pool-name: MyDbHikariPool
# 最小空闲连接
minimum-idle: 5
# 最大连接数,根据数据库max_connections设置,不要过大
maximum-pool-size: 15
# 空闲连接超时时间
idle-timeout: 300000
# 连接最大生命周期,小于数据库连接超时
max-lifetime: 1800000
# 获取连接超时
connection-timeout: 3000
# 连接测试SQL,验证连接可用性
connection-test-query: SELECT 1
# 安全开关:关闭泄露追踪的堆栈打印(防止泄露数据库信息)
leak-detection-threshold: 0
# 日志配置:禁止打印数据库连接串、密码
logging:
level:
com.zaxxer.hikari: WARN
org.springframework.jdbc: WARN
MySQL 版本连接串替换:
url: jdbc:mysql://10.0.0.10:3306/mydb?useSSL=true&verifyServerCertificate=true&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
3. 环境变量注入方式(3 种推荐方式)
方式 1:启动命令注入(生产常用)
# 启动时注入环境变量,不要写在脚本明文,可由容器编排/系统管理注入
export DB_USER="biz_read_write"
export DB_PWD="StrongPass@123456"
java -jar app.jar
方式 2:Docker 容器(docker-compose.yml 片段)
services:
app:
image: myapp:latest
environment:
DB_USER: "biz_read_write"
DB_PWD: "${DB_PWD_FROM_SECRET}" # 从宿主机secret/k8s secret读取,不要写明文
方式 3:K8s 使用 Secret(推荐云原生)
Secret 中存储 DB_USER / DB_PWD,挂载为环境变量,不存于镜像 / 配置。
4. SSL 证书部署说明
将数据库 CA 根证书
root.crt放到应用服务器固定目录/opt/dbca/root.crt;目录权限严格控制:
chmod 600 root.crt && chown appuser:appuser root.crt;sslmode=verify-full:强制校验服务端证书域名,中间人攻击防护;
❌ 禁止使用
sslmode=prefer/require,存在降级明文风险。
5. Java 代码层安全校验(可选,防止启动时打印密码)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.jdbc.core.JdbcTemplate;
@SpringBootApplication
public class DemoApplication implements CommandLineRunner {
@Autowired
private JdbcTemplate jdbcTemplate;
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
// 测试连通性,不要打印数据源信息!
Integer res = jdbcTemplate.queryForObject("SELECT 1", Integer.class);
System.out.println("数据库连接测试成功,结果:" + res);
}
}
6. 安全红线清单
✅ 密码不写入任何配置文件、Git、镜像,由环境变量 / 密钥管理中心注入 ✅ 强制 SSL 并且完整校验证书 ✅ 业务账号非超级账号,权限最小化 ✅ Hikari 关闭连接泄露堆栈打印,避免数据库地址泄露 ✅ 日志级别调高,不打印连接详情
❌ 不要在代码 / 日志打印 dataSource.getPassword() ❌ 不要使用 sslmode=allow/prefer ❌ 不要给业务账号授予 DROP / ALTER / SUPER 权限
7. 进阶方案(更高安全等级,等保场景)
不使用环境变量,改用 KMS / Vault 动态拉取数据库密码,应用启动时实时获取,密码不在环境变量持久化。 可结合 Spring Cloud Config / Apollo 加密配置。
本文原创作者:易君召,详见:https://www.yijunzhao.cc/about,转载请注明出处。
原文链接
欢迎访问