必须配置wallet并正确加载信任证书,否则报ora-29273或ora-28860;三个硬性条件缺一不可:path须为file:/绝对路径、wallet目录下须有cwallet.sso或ewallet.p12+密码、目标站点根/中间证书须用orapki导入且状态为trusted。

Oracle PL/SQL 通过 UTL_HTTP 访问 HTTPS 接口,必须配置 Wallet 并正确加载信任证书——否则会报 ORA-29273: HTTP request failed 或 ORA-28860: SSL handshake failed,根本原因不是网络不通,而是 Wallet 缺失或证书未被信任。
UTL_HTTP.SET_WALLET 调用前必须满足的三个硬性条件
这三者缺一不可,跳过任一环节都会导致调用失败:
-
UTL_HTTP.SET_WALLET的path参数必须是绝对路径,且格式为file:/path/to/wallet(注意开头file:前缀不能漏,也不能写成file://或省略) - Wallet 目录下必须存在
cwallet.sso(自动登录版)或ewallet.p12+ 密码(需传入password参数),仅靠ewallet.p12无法自动打开 - Wallet 中必须已导入目标 HTTPS 站点的根证书或中间证书(不是自签名证书,也不是数据库自己的证书),且该证书状态为 “Trusted” —— 可用
orapki wallet display -wallet /path/to/wallet验证
mkstore 和 orapki 混用会导致证书不可见
mkstore 只管理数据库连接凭证(createCredential),它不处理 HTTPS 所需的信任证书;而 orapki 才负责证书导入。两者操作的是同一 Wallet 文件,但数据域不同。常见错误:
- 用
mkstore -wrl /w -create创建 Wallet 后,直接用mkstore导入证书 → 失败,mkstore根本不支持证书操作 - 用浏览器下载的
example.org.crt是 PEM 格式,但orapki wallet add -trusted_cert要求 DER 或 Base64 编码的证书;若直接导入 PEM 文件,orapki wallet display会显示 0 个证书 - 正确做法:先用
openssl x509 -in example.org.crt -outform der -out example.org.der转换格式,再执行:orapki wallet add -wallet /path/to/wallet -trusted_cert -cert example.org.der -pwd yourpwd
SQLNET.ORA 对 UTL_HTTP 没有任何影响
很多人在 $ORACLE_HOME/network/admin/sqlnet.ora 里配了 WALLET_LOCATION,以为 PL/SQL 就能自动识别——这是误解。UTL_HTTP 完全不读取该文件,它只认 UTL_HTTP.SET_WALLET() 显式传入的路径和密码。即使数据库监听器启用了 Wallet 认证,PL/SQL 发起的 HTTPS 请求也完全无关。
- 客户端机器上配的
sqlnet.ora只影响sqlplus / @db这类命令行连接 - 服务端数据库进程内运行的 PL/SQL,其 Wallet 路径必须对 Oracle OS 用户(如
oracle)可读,且路径存在于数据库服务器本地(不能是 NFS 挂载但无权限的路径) - 若 Wallet 放在 ASM 或 DBFS 上,
UTL_HTTP无法访问 —— 它只支持文件系统路径
ORA-28759: failure to open wallet 的真实原因
这个错误表面是“打不开”,实际可能有五种互不重叠的原因,需逐项排除:
- 路径不存在或拼写错误(比如
/u01/app/oracle/wallet写成/u01/app/oracle/walet) - Oracle 进程用户对该目录无
x(执行)权限 —— Linux 下目录无x权限即无法进入,哪怕有r权限也不行 - Wallet 文件属主不是 Oracle 用户,或权限宽松(如
chmod 755),Oracle 会拒绝加载(安全策略强制要求700) - 传入的
password参数为NULL,但 Wallet 目录下只有ewallet.p12,缺少cwallet.sso(自动登录版) - Wallet 被创建时用了
-auto_login_local(仅限本地登录),而数据库运行在容器或非标准用户上下文下,导致自动登录失效
最易忽略的一点:Wallet 必须在数据库服务器上创建并存放,不能复用客户端机器上的 Wallet 文件——因为 UTL_HTTP 运行在数据库服务进程空间,它看不到你的笔记本电脑硬盘。











