You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java通过SSH本地端口转发连接Oracle云数据库

解决JDBC通过SSH隧道连接Oracle时的ORA-12650错误

嘿,这个ORA-12650错误我之前帮同事排查过,本质是Oracle Net Services无法找到匹配的加密或数据校验和机制——简单说就是你的JDBC客户端和云端Oracle数据库在加密规则上没达成一致,加上SSH隧道转发的场景,更容易触发这个问题。给你几个靠谱的解决办法:

1. 修改JDBC URL,强制禁用加密/校验和

SSH隧道本身已经提供了加密传输,所以可以让JDBC客户端主动放弃加密要求,避免和数据库端的加密配置冲突。在JDBC URL末尾添加以下参数:

String jdbcUrl = "jdbc:oracle:thin:@//localhost:" + local_port_forward + "/service_name?oracle.net.encryption_client=REJECTED&oracle.net.crypto_checksum_client=REJECTED";
  • oracle.net.encryption_client=REJECTED:告诉客户端不要求任何加密
  • oracle.net.crypto_checksum_client=REJECTED:禁用数据校验和要求

这是最快速的临时解决方案,大部分场景下都能直接解决问题。

2. 检查本地Oracle客户端的sqlnet.ora配置(如果有安装)

如果你本地装了Oracle客户端,sqlnet.ora文件里的加密参数可能会覆盖JDBC驱动的默认设置,导致和云端数据库不兼容:

  • 找到客户端安装目录下的network/admin/sqlnet.ora文件
  • 修改或添加以下两行:
    SQLNET.ENCRYPTION_CLIENT = REJECTED
    SQLNET.CRYPTO_CHECKSUM_CLIENT = REJECTED
    
  • 如果不想修改配置,也可以临时重命名这个文件,让JDBC驱动忽略它,使用默认配置。

3. 确保JDBC驱动版本和数据库版本兼容

旧版本的JDBC驱动可能不支持云端数据库使用的加密算法(比如数据库是19c,你用的是11g的ojdbc6驱动)。建议:

  • 下载和数据库版本匹配的驱动:比如12c/19c用ojdbc8,21c用ojdbc11
  • 替换项目中旧的驱动包,重新测试连接

4. 验证SSH隧道的有效性

有时候隧道转发不完整也会间接导致这个错误:

  • 用telnet localhost [local_port_forward]测试本地转发端口是否能连通
  • 如果连不通,先排查SSH隧道配置:比如私钥权限是否正确(Linux下要设为600)、远程服务器是否开放了Oracle默认端口(1521)、隧道转发命令是否正确(比如ssh -i private_key -L local_port:db_host:1521 user@ssh_server)

如果以上方法都不行,可以联系云端数据库的DBA,确认数据库端的SQLNET.ENCRYPTION_SERVER等加密配置,然后调整客户端参数和服务器端匹配(比如服务器要求加密,就把客户端参数设为ACCEPTED并指定对应算法)。

内容的提问来源于stack exchange,提问作者Parthiban

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:07:53