Oracle JDBC SSL连接必须先配置服务端,客户端单改URL大概率失败;需确保数据库监听器启用TCPS、sqlnet.ora设SSL_VERSION=1.2、证书部署进Wallet或JDK信任库,否则Java端无论怎样调整URL或系统属性,均会静默降级为明文TCP或抛出Connection reset/SSLHandshakeException。

Oracle JDBC SSL连接必须先配服务端,客户端单改URL大概率失败
Oracle的SSL不是“客户端开个开关就行”的功能。如果数据库监听器没启用TCPS协议、sqlnet.ora没设SSL_VERSION=1.2、证书没部署进Wallet或没导入JDK信任库,Java端无论怎么调URL或系统属性,最终都只会报IO Error: Connection reset或SSLHandshakeException——而错误堆栈里根本不会提服务端问题。
务必确认以下三点再动Java代码:
- DBA已开放
TCPS端口(常见是1522或2484,自治库必须用2484) -
listener.ora中包含(PROTOCOL=TCPS)地址块,且sqlnet.ora含SSL_VERSION = 1.2 - 数据库已执行
ALTER SYSTEM SET SSL_CLIENT_AUTHENTICATION = TRUE SCOPE=BOTH(如需双向认证)
Wallet方式连接:路径、权限、URL三者缺一不可
生产环境推荐用Oracle Wallet(cwallet.sso + ewallet.p12),但极易因路径或权限失效:
-
-Doracle.net.wallet_location必须是**绝对路径**,且指向**目录**(不是文件),例如/opt/oracle/wallet;Spring Boot中不能写在spring.datasource.url里,得用spring.datasource.hikari.data-source-properties.oracle.net.wallet_location或启动脚本加-D - Linux/macOS下
cwallet.sso权限必须为600,否则静默触发ORA-28860;修复命令:chmod 600 /path/to/wallet/cwallet.sso - JDBC URL必须用完整Oracle Net语法,
PROTOCOL显式写tcps,不能简写:jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=mydb.example.com)(PORT=1522))(CONNECT_DATA=(SERVICE_NAME=orcl)))
JKS方式连接:别混用Wallet参数,否则ORA-28860静默出现
若团队已有统一JKS管理流程,必须彻底清空Wallet相关配置,否则ojdbc驱动会冲突报错:
立即学习“Java免费学习笔记(深入)”;
- 删掉所有
-Doracle.net.wallet_location和URL里的wallet_location参数 - 用JVM参数加载JKS:
-Djavax.net.ssl.trustStore=/etc/ssl/oracle-trust.jks -Djavax.net.ssl.trustStorePassword=changeit - URL中必须加
?oracle.net.ssl_server_dn_match=true,否则证书域名校验跳过,不安全 -
oracle.net.ssl_version属性已废弃,TLS版本由JDK和sqlnet.ora共同控制,JDK 17+默认禁用TLS 1.0/1.1,需确保服务端支持TLSv1.2
TDE数据库连接必须走SSL,否则ORA-28374或ORA-28365几乎必然发生
启用了透明数据加密(TDE)的Oracle库,Wallet中的密钥只在SSL握手阶段自动加载。跳过SSL,驱动根本不会读ewallet.p12:
- 即使数据库本身不要求网络加密,JDBC连接TDE库也必须用
TCPSURL + Wallet路径 +ssl_server_dn_match=true - Wallet目录下必须同时存在
cwallet.sso和ewallet.p12(部分ADB版本只含前者,但TDE场景需两者) - 检查Java进程能否读取
ewallet.p12:ls -l /path/to/wallet/ewallet.p12;避免放在/tmp,某些JVM安全策略会拦截 - 别用TNSNAMES.ora别名解析——它绕过JDBC SSL初始化逻辑,导致Wallet不加载;必须用Easy Connect Plus语法(即带
DESCRIPTION的URL)
chmod 600漏掉,或URL里少了个括号,连接就退化成明文TCP,而驱动不报错、不警告,只在业务查不到加密字段时才暴露问题。


















