ora-29024 根本原因是 utl_http 仅信任 wallet 中显式添加的根及中间证书,未配置或证书链不全导致 ssl 握手阶段校验失败;必须用 orapki 创建 wallet、导入完整证书链,并以 'file:/path/to/wallet' 格式调用 utl_http.set_wallet。

Oracle PL/SQL 调用 HTTPS 接口报 ORA-29024: Certificate validation failure,不是网络不通、也不是目标服务不可达,而是 UTL_HTTP 在 SSL 握手阶段就拒绝了证书——因为 Wallet 里没放对证书,或者根本没配 Wallet。
UTL_HTTP 调用 HTTPS 必须显式配置 Wallet,否则必报 ORA-29024
Oracle 不内置任何公共 CA 根证书(不像 Java 或浏览器),UTL_HTTP 只信任 Wallet 中通过 orapki 显式添加的证书。哪怕目标是 github.com、Let’s Encrypt 签发的站点,只要 Wallet 里没导入对应根证书 + 中间证书,就会在握手第一轮就失败。
- 错误堆栈里出现
UTL_HTTP.BEGIN_REQUEST后紧接ORA-29024,基本可锁定为 Wallet 配置问题 - 别查防火墙、代理、DNS——这些出问题会报
ORA-12545、ORA-29273或超时,不是ORA-29024 -
orapki wallet display -wallet /path/to/wallet输出中必须看到目标站点签发机构的 CN,比如CN=DigiCert Global Root CA或CN=ISRG Root X1
Wallet 必须用 orapki 创建并导入完整证书链
图形化 Oracle Wallet Manager 在云环境(如 ADB)不可用,且不支持批量导入证书链;必须用命令行 orapki 工具操作。
- 创建空 Wallet:
orapki wallet create -wallet /home/oracle/wallet -pwd "MyPass123" -auto_login - 导入根证书和中间证书都用
-trusted_cert参数,不能只导服务器证书:orapki wallet add -wallet /home/oracle/wallet -trusted_cert -cert /tmp/root.pem,再同样导入中间证书 - 自签名或私有 CA 场景下,必须把整个链(root → intermediate → server)合并成单个 PEM 文件再导入,否则链校验断裂
- 验证是否生效:
orapki wallet display -wallet /home/oracle/wallet,确认 Trusted Certificates 列表包含全部必要 CN
UTL_HTTP.SET_WALLET 的路径写法和权限极易出错
UTL_HTTP.SET_WALLET 第一个参数是 Wallet **目录路径**,不是文件名;第二个参数是密码;路径格式或权限不对会导致静默失败或 ORA-24247。
- 正确写法:
UTL_HTTP.SET_WALLET('file:/home/oracle/wallet', 'MyPass123'); - 常见错误:
'file:/home/oracle/wallet/ewallet.p12'(传了文件名)、'/home/oracle/wallet'(缺file:协议头) - Oracle 数据库进程用户(如
oracle)必须对 Wallet 目录有读权限,且目录内所有文件(ewallet.p12、cwallet.sso)也要可读 - 调用前必须先执行
SET_WALLET,不能漏;且每次会话需单独设置,不继承
最常被忽略的一点:Wallet 目录路径中的符号链接不能跨文件系统,否则 Oracle 进程可能无法解析;另外,如果数据库运行在容器或云服务中,Wallet 目录必须挂载到容器内且路径与 SET_WALLET 中一致——路径错半字符,证书就白配了。











