UTL_HTTP访问HTTPS失败主因是ACL未配置或Wallet证书链不全:ORA-24247表明ACL缺失(需DBMS_NETWORK_ACL_ADMIN创建并授connect/resolve权限),ORA-29024表明Wallet缺根或中间证书(需orapki导入完整信任链)。
UTL_HTTP访问HTTPS失败,90%以上不是代码写错,而是缺两样东西:ACL权限没配,或者Wallet证书链不全。这两项任一缺失,都会直接报错,且错误信息容易误导人。
Oracle 11gR2起强制ACL机制,哪怕目标是https://localhost:443,只要没进ACL列表,就会报ORA-24247: network access denied by access control list (ACL)。这不是网络不通,是数据库主动拦截。
DBMS_NETWORK_ACL_ADMIN包创建ACL,不能只赋EXECUTE权限DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl=>'my_acl', host=>'api.example.com'),通配符*不被支持443,就不能用440-450代替connect和resolve权限,后者用于DNS解析,漏掉会导致ORA-29273伴随ORA-06512
Oracle不内置CA信任库,UTL_HTTP调HTTPS时只认Wallet里的证书。哪怕 用的是Let’s Encrypt,只要Wallet里没导入它的根+中间证书,就卡在SSL握手阶段,报ORA-29024: Certificate validation failure或ORA-28860: fatal SSL error。
orapki命令行创建,图形化Oracle Wallet Manager已弃用,且不支持批量导入证书链-trusted_cert参数,且需分别导入根证书和中间证书(例如DigiCert Global Root CA + DigiCert TLS RSA SHA256 2020 CA1)server.crt),必须合并完整链:用cat root.pem intermediate.pem > full_chain.pem再导入UTL_HTTP.SET_WALLET第一个参数是目录路径,不是文件名:'file:/home/oracle/wallet' ✅,'file:/home/oracle/wallet/ewallet.p12' ❌SET_WALLET静默失败很常见,表面没报错,实际请求仍走不通过SSL校验——根本原因是路径格式错或OS权限不足。
file:协议头,且指向Wallet所在**目录**,不是.p12文件oracle)必须对整个Wallet目录有读权限,且ewallet.p12和cwallet.sso不能被组或其他用户写入(否则拒绝加载)700,文件设为600,避免因权限宽松导致加载失败真正麻烦的不是某一步操作,而是这两套机制(ACL + Wallet)必须同时生效、各自完整,缺一不可。尤其在自治数据库(ADB)或云环境里,Wallet路径常被误写成挂载路径别名,ACL又容易漏掉resolve权限——这些细节不验证,光看错误码会反复踩坑。