spring boot无法通过application.yml或properties直接传入wallet路径实现免密连接,必须用jvm参数或data-source-properties显式配置oracle.net.wallet_location等属性,且需确保sqlnet.ora本地有效、ojdbc11+与java 17兼容。

Spring Boot 应用无法通过 application.yml 或 application.properties 直接传入 Wallet 路径完成免密连接——HikariCP 不透传 oracle.net.wallet_location 等 Wallet 相关属性,必须用 JVM 参数或 data-source-properties 显式注入。
Wallet 文件准备与 sqlnet.ora 配置必须本地有效
Oracle JDBC 驱动在运行时会读取本地 sqlnet.ora 中的 WALLET_LOCATION 和 SQLNET.WALLET_OVERRIDE=TRUE,这两项缺一不可。即使你用 JVM 参数指定了 wallet 路径,驱动仍会尝试加载 sqlnet.ora;若该文件不存在、路径错误或权限不足,会静默失败,最终报 ORA-12649: Unknown encryption or data integrity algorithm 或直接连接超时。
-
WALLET_LOCATION的DIRECTORY必须指向包含cwallet.sso和ewallet.p12的完整目录(不是文件路径) -
sqlnet.ora位置优先级:JDBC 驱动先查ORACLE_HOME/network/admin,再查CLASSPATH根目录,最后查系统环境变量TNS_ADMIN指向路径 - Spring Boot 打包为 jar 后,
sqlnet.ora不能放在 jar 包内——必须放在启动目录或TNS_ADMIN指定的外部路径下
Spring Boot 中配置 Wallet 的两种可靠方式
推荐使用 spring.datasource.hikari.data-source-properties,它能被 HikariCP 正确转为 JDBC 属性;而 spring.datasource.url 中硬塞 ?oracle.net.wallet_location=... 是无效的,JDBC 驱动不识别 URL 参数形式的 Wallet 配置。
- 写法示例(application.yml):
spring: datasource: hikari: data-source-properties: oracle.net.wallet_location: /opt/oracle/wallet oracle.net.ssl_server_cert_dn: "CN=wallet-server,O=MyOrg,C=CN" - 等效的 JVM 启动参数(更彻底,绕过任何配置层干扰):
-Doracle.net.wallet_location=/opt/oracle/wallet -Doracle.net.ssl_server_cert_dn="CN=wallet-server,O=MyOrg,C=CN" - 注意:
ssl_server_cert_dn是必需的,否则即使 wallet 存在也会报ORA-28860: Fatal SSL error;值必须与 wallet 中证书的 Subject 完全一致(区分大小写、空格、顺序)
ojdbc11 + Java 17 是唯一稳定组合
Oracle 21c 及自治数据库强制要求 TLS 1.2+ 和 mTLS,旧版 ojdbc8 在 Java 17 下会因缺失 javax.xml.bind 类或驱动类废弃(oracle.jdbc.driver.OracleDriver 已移除)导致连接失败,且 Wallet 支持也仅在 ojdbc11+ 中完善。
- 依赖必须用:
oracle.jdbc:ojdbc11:21.12.0.0或更高版本 -
driver-class-name必须设为oracle.jdbc.OracleDriver,设成旧类名会触发java.lang.ClassNotFoundException - URL 格式建议用服务名模式:
jdbc:oracle:thin:@//host:port/SERVICE_NAME,不要加?oracle.net.ssl_version=1.2——Wallet 启用后 TLS 版本由 wallet 内置策略控制,手动指定反而可能冲突
Wallet 免密本质是把认证委托给 Oracle 的 SSL/TLS 握手流程,所以所有环节——从 cwallet.sso 文件权限、sqlnet.ora 位置、JVM 参数可见性,到 ojdbc 版本与 JDK 的 ABI 兼容性——都必须严丝合缝;漏掉任意一环,错误日志往往不报 “wallet not found”,而是表现为连接超时或 SSL 握手失败,排查时容易误判为网络问题。











