必须先配置服务端tcps监听和有效wallet,客户端再设置oracle.net.wallet_location等参数才有效;否则连接失败或静默降级到tcp。

Java连接Oracle数据库启用SSL加密,不是改几个URL参数就能通的——服务端没配好TCPS监听和Wallet,客户端再怎么调oracle.net.ssl_server_dn_match也连不上,错误常是IO Error: Connection reset或静默降级到TCP。
必须先确认服务端已启用TCPS监听和有效Wallet
客户端所有SSL配置都依赖服务端已就绪。常见误判是看到JDBC URL写了PROTOCOL=TCPS就以为OK,实际数据库根本没在TCPS端口监听。
- 让DBA检查
listener.ora里是否有类似(ADDRESS=(PROTOCOL=TCPS)(HOST=...)(PORT=1522))的条目,且lsnrctl status输出中明确列出TCPS协议行 - 确认
sqlnet.ora设置了SSL_VERSION = 1.2(Oracle 12c+必需),且WALLET_LOCATION指向含cwallet.sso的绝对路径,权限为700 - 验证证书链完整:用
orapki wallet display -wallet /path/to/wallet看是否包含服务器证书+CA证书,缺中间证书会导致ORA-29024
Java客户端用Wallet方式最稳,但路径和权限极易出错
Wallet是Oracle原生方案,比JKS更少兼容性问题,但oracle.net.wallet_location必须通过JVM系统属性传,URL里写wallet_location参数完全无效——驱动静默忽略,连接走明文TCP。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- JVM启动时加
-Doracle.net.wallet_location=/opt/oracle/wallet(Linux/macOS)或-Doracle.net.wallet_location=C:/oracle/wallet(Windows,推荐正斜杠) - Wallet目录权限必须是
700,cwallet.sso文件权限必须是600;Linux下权限为644会触发ORA-28860,错误信息却不提权限 - JDBC URL必须用完整Oracle Net语法:
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=mydb.example.com)(PORT=1522))(CONNECT_DATA=(SERVICE_NAME=orcl))),不能简写为@host:port/service
别混用Wallet和javax.net.ssl.*参数
Wallet和JDK的javax.net.ssl.trustStore是两套互斥机制。同时配置会导致SSL握手失败,报ORA-28860或SQLRecoverableException: IO Error: The Network Adapter could not establish the connection,但错误不提示冲突根源。
- 用Wallet时,确保JVM启动参数、
System.setProperty、ojdbc.properties里**完全不出现**javax.net.ssl.trustStore、javax.net.ssl.keyStore等 - Wallet目录下必须有
cwallet.sso(必要)和ewallet.p12(TDE场景必需),仅靠tnsnames.ora别名不够 - Spring Boot用户应配
spring.datasource.hikari.data-source-properties.oracle.net.wallet_location=/path,而非在url里拼参
TDE数据库必须走SSL,否则Wallet凭据不加载
启用了透明数据加密(TDE)的库,JDBC驱动只在SSL握手阶段自动加载ewallet.p12里的主密钥。跳过SSL,必然报ORA-28374(找不到已加载的主密钥)或ORA-28365(Wallet未打开)。
- 即使数据库本身不要求SSL,TDE场景下也必须强制启用,URL、Wallet路径、
oracle.net.ssl_server_dn_match=true三者缺一不可 - Wallet路径必须是**目录路径**,不是
ewallet.p12文件路径;驱动会自动扫描该目录下的ewallet.p12 - 避免把Wallet放在
/tmp或容器临时卷——某些JVM安全策略会拒绝加载,且权限易被覆盖
最容易被忽略的是服务端监听器配置和Wallet文件权限,这两处出问题时,客户端日志往往没有直接线索,只会表现为连接超时或重置。动手前先用tnsping或openssl s_client -connect host:port -tls1_2验证TCPS端口可达性和证书响应,比反复改Java配置高效得多。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










