ora-24247是acl未配置或配错导致的数据库主动拦截,非网络不通;必须用dbms_network_acl_admin显式创建acl、授予connect和resolve权限、精确绑定主机名/ip及端口,并确保principal大小写严格匹配。

UTL_HTTP 报 ORA-24247 不是网络不通,而是数据库主动拦截——ACL 没配或配错。
ORA-24247 本质是 Oracle 11gR2 起强制启用的访问控制机制
哪怕目标是 https://localhost:443,只要没进 ACL 列表,UTL_HTTP 就不会发包,直接抛 ORA-24247。这不是 DNS、防火墙或 SSL 层的问题,是数据库在应用层就拒绝了请求发起。
- ACL 是 XML 文件(如
/sys/acls/utl_http.xml),由DBMS_NETWORK_ACL_ADMIN管理,不是传统 GRANT 权限 - 只给用户
EXECUTE权限对UTL_HTTP完全无效,必须显式配置 ACL -
principal参数严格区分大小写:写'SCOTT'✅,写'scott'❌(会报ORA-44416: Invalid ACL: Unresolved principal)
常见 ACL 配置错误点
查 ACL 是否生效不能只看创建语句是否执行成功,得查三张视图:
-
SELECT * FROM dba_network_acls:确认 ACL 文件已存在且绑定过主机 -
SELECT * FROM dba_network_acl_privileges WHERE principal = 'YOUR_USER':确认该用户有connect和resolve两个权限(漏resolve会导致ORA-29273+ORA-06512) -
SELECT host, lower_port, upper_port FROM dba_network_acl_entries WHERE acl LIKE '%utl_http%':确认host值与你代码里请求的域名/IP 完全一致(api.example.com≠www.example.com,127.0.0.1≠localhost)
生产环境别用 host => '*':Oracle 实际不支持通配符主机名,* 只在部分旧文档中被误传;必须写具体域名或 IP。
ACL 和 Wallet 必须同时就位才可能成功调 HTTPS
ORA-24247 和 ORA-29024 经常成对出现,但它们是两套独立校验:
-
ORA-24247:ACL 拦截,连 TCP 握手都不会发起 -
ORA-29024:ACL 放行后,SSL 握手失败(Wallet 缺根证书或中间证书) - 即使 Wallet 配对了,ACL 没开也会先报
ORA-24247;反过来,ACL 开了但 Wallet 错,才会看到ORA-29024 -
UTL_HTTP.SET_WALLET('file:/path/to/wallet', '')中的路径必须是目录,不是文件;且 Oracle 进程用户(如oracle)需对该目录有读权限,ewallet.p12和cwallet.sso文件权限不能含 group/other 写位(否则静默失败)
真正容易被忽略的是:ACL 的 host 字段和你代码中 UTL_HTTP.BEGIN_REQUEST('https://api.example.com') 的域名必须字节级一致,包括大小写、端口、有无 www 前缀——差一个字符,ACL 就不匹配。











