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
相关产品推荐
相关产品推荐

