You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot(JDK17)配置Oracle RDS TCPS连接报错求助

问题描述

尝试通过Spring Boot应用连接Oracle RDS,使用TCPS协议时遇到错误:

Failed to create/setup connection: IO Error: IO Error PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

环境信息:

  • JDK版本:17
  • ojdbc8版本:21.9.0.0
  • 已将keystore.jks放置在应用resources目录下

已尝试的配置方式:

  1. 第一种方法(通过connection-properties配置)
spring:
  datasource:
    url: jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS(PROTOCOL=TCPS)(HOST=<host_name>)(PORT=2484))(CONNECT_DATA=(SID=<db_name>)))
    username: <user_name>
    password: <password>
    driver-class-name: oracle.jdbc.OracleDriver
    connection-properties: |
      javax.net.ssl.keyStoreType=JKS;
      javax.net.ssl.keyStore=classpath:keystore.jks;;
      javax.net.ssl.keyStorePassword=<keystore-password>;
      javax.net.ssl.trustStoreType=JKS;
      javax.net.ssl.trustStore=classpath:keystore.jks;
      javax.net.ssl.trustStorePassword=<keystore-password>
  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.OracleDialect
  1. 第二种方法(通过Hikari data-source-properties配置)
spring:
  datasource:
    url: jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS(PROTOCOL=TCPS)(HOST=<host_name>)(PORT=2484))(CONNECT_DATA=(SID=<db_name>)))
    username: <user_name>
    password: <password>
    driver-class-name: oracle.jdbc.OracleDriver
    hikari:
      data-source-properties: |
      oracle.net.ssl_server_dn_match=true;
      oracle.net.ssl_version=1.2;
      javax.net.ssl.trustStoreType=JKS;
      javax.net.ssl.trustStore=classpath:keystore.jks;
      javax.net.ssl.trustStorePassword=<keystore-password>
  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.OracleDialect
  1. 第三种方法(通过Spring SSL Bundle配置)
spring:
  datasource:
    url: jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS(PROTOCOL=TCPS)(HOST=<host_name>)(PORT=2484))(CONNECT_DATA=(SID=<db_name>)))
    username: <user_name>
    password: <password>
    driver-class-name: oracle.jdbc.OracleDriver
  ssl:
    bundle:
      jks:
        server:
          key:
            alias: "server"
          keystore:
            location: "classpath:keystore.jks"
            password: <keystore-password>
            type: JKS
  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.OracleDialect
  1. 额外尝试:将bundle.pem导入JDK的cacerts
sudo keytool -importcert alias rds-root -file /bundle.pem -keystore "jdk-17/lib/security/cacerts" -storepass <password>

需指导如何在JDK17的Spring Boot应用中正确配置Oracle DB的TCPS连接。


解决方案

核心问题分析

PKIX路径构建失败本质是JVM无法从信任库中找到Oracle RDS TCPS证书的完整信任链,常见原因:

  • 信任库配置未被JDBC驱动正确加载
  • 证书导入不完整(如仅导入根证书,缺少中间证书)
  • 配置格式错误(路径写法、分隔符、YAML缩进问题)

正确配置步骤

1. 确认证书完整性

先检查keystore.jks是否包含完整信任链(根证书+中间证书),执行命令:

keytool -list -v -keystore src/main/resources/keystore.jks -storepass <keystore-password>

若使用bundle.pem导入,需确保该文件包含完整证书链,而非单一证书。

2. HikariCP正确配置(推荐)

Spring Boot默认使用HikariCP,采用键值对形式配置(避免多行字符串的缩进/分隔符问题):

spring:
  datasource:
    url: jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=<host_name>)(PORT=2484))(CONNECT_DATA=(SID=<db_name>)))
    username: <user_name>
    password: <password>
    driver-class-name: oracle.jdbc.OracleDriver
    hikari:
      data-source-properties:
        oracle.net.ssl_server_dn_match: true
        oracle.net.ssl_version: TLSv1.2
        javax.net.ssl.trustStoreType: JKS
        javax.net.ssl.trustStore: classpath:keystore.jks
        javax.net.ssl.trustStorePassword: <keystore-password>
        # 仅双向认证时需配置以下项,单向认证无需设置
        # javax.net.ssl.keyStoreType: JKS
        # javax.net.ssl.keyStore: classpath:keystore.jks
        # javax.net.ssl.keyStorePassword: <keystore-password>
  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.OracleDialect

说明:单向认证仅需验证服务器身份,只需配置trustStore相关;双向认证需同时配置keyStore。

3. 修复JDK cacerts导入问题

若选择导入JDK默认信任库:

  • JDK17的cacerts默认密码为changeit(未修改过的情况)
  • 导入后验证证书是否成功添加:
keytool -list -alias rds-root -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit
  • 确保应用使用的JDK与导入证书的JDK为同一版本(避免环境变量指向不同JDK)

4. 调试技巧

若仍无法连接,添加JVM参数开启SSL调试,定位具体问题:

-Djavax.net.debug=ssl,handshake

启动后查看日志,可获取SSL握手的详细过程,明确是证书缺失、信任链不完整还是配置未生效。

常见错误排查

  • 第一种方法中connection-properties的javax.net.ssl.keyStore=classpath:keystore.jks;;多了一个分号,导致路径解析错误
  • 第二种方法的data-source-properties使用多行字符串时缩进错误,YAML对缩进敏感,需保证属性对齐
  • 第三种方法的Spring SSL Bundle仅用于Web服务的SSL配置,不直接作用于JDBC数据源,因此无法生效

内容的提问来源于stack exchange,提问作者Ajin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 18:55:11