如何配置Java应用通过SSL/TLS加密连接Oracle数据库_在JDBC连接串中指定Wallet路径与协议

冬宇君_8057

冬宇君_8057

2026-06-05

980人浏览

原创

Oracle JDBC驱动不支持在URL中配置wallet_location或wallet_path参数,必须通过JVM系统属性-Doracle.net.wallet_location指定绝对目录路径;URL须用TCPS协议并显式展开为Oracle Net语法,且不可混用javax.net.ssl.*参数,否则触发ORA-28860等SSL错误。

jdbc URL里不能写wallet_path参数

oracle jdbc驱动根本不认wallet_location或wallet_path这类url参数。你在jdbc:oracle:thin:@...?wallet_location=/path里加这个,驱动直接忽略——既不报错也不生效,连接照样走明文tcp,ssl静默失效。

Wallet路径必须通过JVM系统属性传入,且只能是目录路径(不是cwallet.sso文件路径):

  • -Doracle.net.wallet_location=/opt/oracle/wallet(Linux/macOS)
  • -Doracle.net.wallet_location=C:\oracle\wallet(Windows,注意反斜杠转义或用正斜杠)

Spring Boot用户别在application.properties里写spring.datasource.url带wallet参数,正确做法是配spring.datasource.hikari.data-source-properties.oracle.net.wallet_location=/path,或者更稳妥地在启动脚本里加-D参数。

tcps协议+2484端口只适用于自治数据库(ADB)

如果你连的是普通Oracle数据库(非ADB),别硬套tcps://host:2484——它大概率连不上。普通库的SSL监听端口由DBA配置,常见是1522、2483等,必须从listener.ora和sqlnet.ora确认,不能猜。

URL格式必须显式展开为Oracle Net语法,不能简化:

  • ✅ 正确:jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=mydb.example.com)(PORT=1522))(CONNECT_DATA=(SERVICE_NAME=orcl)))
  • ❌ 错误:jdbc:oracle:thin:@mydb.example.com:1522/orcl(没tcps,没DESCRIPTION)
  • ❌ 错误:jdbc:oracle:thin:@//mydb.example.com:2484/ORCL(ADB专用,普通库不认)

自治数据库(ADB)是例外:它强制tcps + 2484 + 完整DESCRIPTION,且SERVICE_NAME必须带.adb.oraclecloud.com后缀,大小写敏感。

cwallet.sso权限不对会导致ORA-28860但不提示原因

Linux/macOS下cwallet.sso权限高于600(比如644或664),ojdbc驱动会拒绝加载并抛出ORA-28860: SSL/TLS error。这个错误信息完全没提权限问题,容易误判为证书或网络故障。

Java Maven Code Review
Java Maven Code Review

审查Java Maven项目(ZIP压缩包或GitLab仓库URL),检查代码规范、命名、模块边界、可维护性问题以及重复代码。

下载

检查和修复命令:

  • 确认权限:ls -l /opt/oracle/wallet/cwallet.sso(必须显示-rw-------)
  • 修复:chmod 600 /opt/oracle/wallet/cwallet.sso
  • Wallet目录本身也要700:chmod 700 /opt/oracle/wallet

Windows下无文件权限概念,但当前JVM进程用户必须对Wallet目录有读取+执行(遍历)权限,否则java.sql.SQLException: IO Error: Unknown error while reading wallet。

混用Wallet和javax.net.ssl.*参数会触发SSL握手失败

一旦设了oracle.net.wallet_location,就绝对不能再配javax.net.ssl.trustStore或javax.net.ssl.keyStore。ojdbc驱动检测到后者存在,会直接放弃Wallet,转而尝试用JVM默认SSL上下文——结果就是ORA-28860或javax.net.ssl.SSLHandshakeException。

排查要点:

  • 启动时grep JVM参数:ps aux | grep 'javax\.net\.ssl',确保没残留
  • Docker容器中检查entrypoint脚本或java -D...命令行是否意外注入了SSL系统属性
  • Spring Boot应用检查application.properties是否误配了server.ssl.*或spring.http.ssl.*,这些不影响JDBC,但可能干扰全局SSL上下文

Wallet是Oracle原生方案,JKS是Java通用方案,二者互斥。生产环境优先用Wallet,它把证书、私钥、信任链全打包进cwallet.sso,省去密钥库路径、密码、算法匹配等一堆易错环节。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

10037

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

7182

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

6312

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

1084

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

908

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1336

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2649

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

19971

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

1175

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习