Oracle Wallet路径必须用绝对路径且权限严格为700,属主为运行用户;ojdbc.properties中不可配置wallet_password;JDBC URL须用tnsnames.ora别名格式(如jdbc:oracle:thin:/@alias);TLS协议需与ojdbc版本及JDK匹配。
Oracle Wallet路径配置必须用绝对路径且权限严格
oracle wallet不支持相对路径,oracle.net.wallet_location 必须指向完整绝对路径,比如 /opt/oracle/wallet;wallet目录及其内部文件(cwallet.sso、ewallet.p12)的属主和权限必须严格限制——oracle客户端要求 wallet 目录权限 ≤ 700,文件权限 ≤ 600。若用 chmod 755 或属主为非运行用户,jdbc 连接会静默失败或抛出 java.sql.sqlexception: io error: unknown error while reading wallet。
- 检查命令:
ls -ld /opt/oracle/wallet和ls -l /opt/oracle/wallet/*.sso - 修复示例:
chown appuser:appgroup /opt/oracle/wallet && chmod 700 /opt/oracle/wallet && chmod 600 /opt/oracle/wallet/cwallet.sso - Windows 下需确保当前 JVM 进程用户对 Wallet 目录有读取+执行权限(目录需可遍历)
ojdbc.properties里不能写wallet_password
Oracle JDBC 驱动明确禁止在 ojdbc.properties 或连接 URL 中明文传递 Wallet 密码。wallet_password 不是合法属性,硬编码会导致连接时抛出 java.sql.SQLException: Invalid property name: wallet_password。Wallet 若设了密码(即用 mkstore -wrl ... -create 创建时指定了密码),必须通过 JVM 系统属性 oracle.net.wallet_password 传入,且仅限测试环境——生产应使用无密码 Wallet(-auto_login_local 模式)。
- 正确做法(测试):
java -Doracle.net.wallet_password=mypass -jar myapp.jar - 生产推荐:
mkstore -wrl /opt/oracle/wallet -create -auto_login_local,此时完全不用配密码 -
ojdbc.properties中只需保留:oracle.net.wallet_location=/opt/oracle/wallet
连接URL必须省略host/port/serviceName,改用tnsnames.ora别名
启用 Wallet 后,JDBC URL 不能写成 jdbc:oracle:thin:@//host:1521/ORCL 这类直连格式,否则 Wallet 被忽略。必须使用 TNS 别名,且该别名定义在 Wallet 内置的 tnsnames.ora 中(由 mkstore 自动注入,不可手动编辑)。URL 格式只能是 jdbc:oracle:thin:/@mydb_alias(注意开头双斜杠后紧跟 @ 和别名)。
- 验证别名是否存在:
mkstore -wrl /opt/oracle/wallet -list_creds(看是否有对应别名条目) - 错误写法:
jdbc:oracle:thin:@localhost:1521:ORCL→ SSL 不生效,报 ORA-28860 - 正确写法:
jdbc:oracle:thin:/@prod_db,其中prod_db是mkstore添加的 TNS 别名
ojdbc版本与TLS协议兼容性常被忽略
Oracle Wallet 的 SSL 握手依赖底层 JDK TLS 实现,而不同 ojdbc 版本对 TLS 协议支持差异极大。ojdbc8(19c 及以上)默认启用 TLS 1.2,但若服务端只开 TLS 1.1 或强制要求 TLS 1.3,可能握手失败并报 ORA-28860: Fatal SSL error。此时不能靠改 Wallet 解决,必须协同调整:
- 检查服务端支持的 TLS:
SELECT * FROM v$parameter WHERE name = 'ssl_version'; - ojdbc8 + JDK 8u251+ 支持 TLS 1.3,但需显式启用:
-Djdk.tls.client.protocols=TLSv1.3 - 若用 ojdbc7(12c),默认最高只到 TLS 1.1,连 TLS 1.2 服务端需升级驱动或加 JVM 参数:
-Doracle.net.ssl_version=1.2 - Wallet 本身不存 TLS 版本配置,所有协议协商发生在 JDBC 层和 Oracle Net 层
Wallet 文件结构、TNS 别名、JVM 权限、驱动版本、TLS 协商——这五者只要一个错位,SSL 连接就卡在无声失败上。调试时优先用 sqlplus /@mydb_alias 验证 Wallet 是否能通,再切回 Java。
立即学习“Java免费学习笔记(深入)”;


















