小易说IT 小易说IT

SpringBoot + HikariCP 安全数据库连接完整配置

适用: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 证书部署说明

  1. 将数据库 CA 根证书 root.crt 放到应用服务器固定目录 /opt/dbca/root.crt

  2. 目录权限严格控制:chmod 600 root.crt && chown appuser:appuser root.crt

  3. 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,转载请注明出处。

原文链接 https://www.yijunzhao.cc/archives/springboot-hikaricp-secure-database-connection-configuration

欢迎访问 https://www.yijunzhao.cc/

https://www.yijunzhao.cc/