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

Oracle 19c运行12c开发的存储过程报ORA-29013错误如何解决

问题产生原因
  • Oracle 19c默认启用了比12c严格得多的SSL/TLS安全策略,默认禁用了TLS 1.0、TLS 1.1等旧版本协议,以及基于SHA1、MD5的弱MAC算法、弱加密套件。如果目标外部API仍在使用上述被19c默认禁用的加密相关配置,SSL握手阶段就会触发MAC校验失败报错。
  • 19c对Oracle钱包的校验规则更严格:12c环境下仅导入站点证书、缺少中间/根证书,或者钱包文件权限宽松的情况下可能正常运行,但19c要求必须导入完整的证书链,且运行Oracle实例的操作系统用户对钱包目录、文件的权限必须为最小权限(目录700,文件600),否则会触发SSL校验错误。
  • UTL_HTTP默认配置不兼容:19c的UTL_HTTP默认的加密套件列表排除了所有弱加密套件,如果目标API仅支持旧的弱加密套件,未显式指定兼容的加密套件就会触发报错。
解决方案
  1. 先确认目标外部API的SSL配置
    使用openssl工具查询目标API支持的TLS版本和加密套件:
    openssl s_client -connect <API域名>:<HTTPS端口,默认443>
    记录输出中的Protocol(TLS版本)和Cipher(使用的加密套件)字段值。

  2. 调整SQLNET.ORA配置
    编辑$ORACLE_HOME/network/admin/sqlnet.ora文件,添加对应兼容配置:

# 允许使用的TLS版本,根据第一步查询到的结果填写,比如1.2、1.1等
SSL_VERSION = 1.2
# 允许使用的加密套件,填写第一步查询到的加密套件对应的Oracle规范名
SSL_CIPHER_SUITES = (SSL_RSA_WITH_AES_256_CBC_SHA256, SSL_RSA_WITH_AES_128_GCM_SHA256)
  1. 校验并更新Oracle钱包配置
  • 确认钱包中已完整导入目标API的站点证书、所有中间证书、根证书,可通过以下命令查看钱包内容:
    orapki wallet display -wallet <钱包目录绝对路径>
  • 修正钱包权限:
chmod 700 <钱包目录绝对路径>
chmod 600 <钱包目录绝对路径>/*
chown -R oracle:oinstall <钱包目录绝对路径>

(上述命令中oracle:oinstall为Oracle实例默认运行用户和用户组,根据实际环境调整)

  1. 调整UTL_HTTP调用代码
    在存储过程的UTL_HTTP调用部分,显式指定钱包配置和TLS版本,不要依赖数据库默认值:
-- 调用接口前先设置钱包
UTL_HTTP.SET_WALLET('file:<钱包目录绝对路径>', '<钱包密码>');
req := UTL_HTTP.BEGIN_REQUEST(<API地址>, 'POST', 'HTTP/1.1');
-- 显式指定TLS版本,和第一步查询到的API支持版本保持一致
UTL_HTTP.SET_OPTION(r => req, name => UTL_HTTP.TLS_VERSION, value => UTL_HTTP.TLS_VERSION_1_2);
  1. 生效配置
    重启Oracle监听和数据库实例,使SQLNET.ORA的配置生效。

如果执行上述操作后仍报错,可开启UTL_HTTP debug trace获取更详细的错误信息:
ALTER SESSION SET EVENT='10937 trace name context forever, level 2';
执行存储过程后,查看user_dump_dest目录下生成的trace文件,可定位具体的握手失败节点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 09:09:02