生产环境oracle wallet必须用-auto_login_local模式生成,确保cwallet.sso存在且权限为600;jvm通过-doracle.net.wallet_location指定绝对路径;jdbc url须为jdbc:oracle:thin:/@mydb_alias格式,三者缺一不可。

Wallet必须用auto_login_local模式生成,不能带密码
Wallet设了密码(比如用mkstore -wrl /path -create)会导致JDBC连接时要求传oracle.net.wallet_password,这违背“免密”初衷。生产环境唯一可靠的方式是用-auto_login_local创建:
mkstore -wrl /opt/oracle/wallet -create -auto_login_local- 生成后目录下必须有
cwallet.sso(不是ewallet.p12),驱动只认这个文件触发自动登录 - 别手动编辑
tnsnames.ora——Wallet里的别名由mkstore -wrl ... -createCredential注入,且大小写敏感
JVM参数指定wallet_location,URL里不能写host/port
URL写jdbc:oracle:thin:@//host:1521/ORCL或带wallet_location=...参数,驱动直接忽略Wallet,走明文TCP。正确姿势是:
- JVM启动加:
-Doracle.net.wallet_location=/opt/oracle/wallet(必须是绝对路径,不能是./wallet或file:/app/wallet) - URL只保留TNS别名格式:
jdbc:oracle:thin:/@mydb_alias(注意开头是:/@,不是:@) - 验证别名是否存在:
mkstore -wrl /opt/oracle/wallet -list_creds,输出里要有mydb_alias条目
Linux/macOS下cwallet.sso权限必须是600
权限宽松会静默失败,报ORA-28860: SSL/TLS error,但错误信息完全不提权限问题,容易误判为证书或网络故障。
- 检查命令:
ls -l /opt/oracle/wallet/cwallet.sso,结果必须是-rw------- - 修复命令:
chmod 600 /opt/oracle/wallet/cwallet.sso,同时确保目录权限≤700:chmod 700 /opt/oracle/wallet - Windows不用改权限,但要确认运行JVM的用户对整个Wallet目录有读+执行权限(目录需可遍历)
Spring Boot里别在url里硬塞wallet参数
在application.properties里写spring.datasource.url=jdbc:oracle:thin:@?wallet_location=...完全无效,驱动不解析URL里的wallet参数。
- 稳妥做法:配
spring.datasource.hikari.data-source-properties.oracle.net.wallet_location=/opt/oracle/wallet - 更推荐:启动脚本里直接加
-Doracle.net.wallet_location=/opt/oracle/wallet,避免YAML缩进或引号引发的配置失效 - 切记清空
javax.net.ssl.trustStore等JVM参数——混用Wallet和JKS会触发ORA-28860
cwallet.sso、JVM系统属性指向它的绝对路径、URL用:/@alias格式触发别名解析。漏掉任一环,连接都会退化成明文或静默失败。Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











