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语法,不能简化:
立即学习“Java免费学习笔记(深入)”;
- ✅ 正确:
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。这个错误信息完全没提权限问题,容易误判为证书或网络故障。
检查和修复命令:
- 确认权限:
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,省去密钥库路径、密码、算法匹配等一堆易错环节。


















