ora-24247错误源于缺失acl配置,而非网络或代码问题;必须用大写用户名创建acl、同时授予connect和resolve权限、精确匹配host与端口,并执行commit才能生效。

ORA-24247 错误说明你缺的不是代码,是 ACL 配置
只要 UTL_HTTP、UTL_TCP 或 UTL_DBWS 报 ORA-24247,就不是 URL 写错、网络不通或证书问题,而是数据库压根没给你开网络闸门。ACL 是 Oracle 11g+ 强制启用的独立权限层,和 GRANT EXECUTE ON UTL_HTTP 完全无关,不配 ACL,授权再多也没用。
CREATE_ACL 必须指定大写用户名,不能填角色或小写名
常见错误是把 principal 写成 'app_user'、'APPUSER' 或 'CONNECT' —— 这些全无效。Oracle 严格比对大小写和账号类型:
-
principal必须是真实数据库用户的**大写全名**,比如用户建的时候是CREATE USER APP_USER IDENTIFIED BY ...,那这里就得写principal => 'APP_USER' - 不能填角色(哪怕该角色有
EXECUTE ON UTL_HTTP),ACL 不认角色继承 - 用户必须已存在;不能在
CREATE USER之前就跑CREATE_ACL,会直接报错 - ACL 文件名(
acl参数)别硬写'utl_http.xml'—— 如果系统里已有同名文件,新配置会覆盖旧规则,导致其他用户网络中断
域名请求必须同时配 connect 和 resolve,且属于同一 ACL 文件
如果 WebService 地址含域名(如 https://api.example.com/v1),只授 connect 权限会导致后续报 ORA-29273 + ORA-12545:Oracle 能发请求,但 DNS 解析失败。
必须分两步操作,且 acl 参数值完全一致:
- 先用
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL创建 ACL 并加connect - 再用
DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE同一acl名下加resolve -
resolve不等于能连通,它只是允许 Oracle 调用 DNS;连通性仍取决于ASSIGN_ACL的host和端口是否匹配
ASSIGN_ACL 的 host 和端口必须精确,且 COMMIT 才生效
ASSIGN_ACL 是 ACL 生效的最后一环,也是最容易漏掉关键点的一环:
-
host不支持正则或模糊匹配,只接受完整域名/IP 或通配符'*';若实际请求的是Api.Example.Com,ACL 中也得写host => 'Api.Example.Com'(大小写敏感) -
lower_port/upper_port是闭区间:请求https://svc:443/就得写lower_port => 443, upper_port => 443;HTTP 默认 80、HTTPS 默认 443 别漏 -
host => '*'在测试环境可快速验证,但生产环境禁用——它等价于放行所有外网目标,绕过白名单控制 - 所有
DBMS_NETWORK_ACL_ADMIN操作都在事务中,不执行COMMIT,权限永不生效;很多人配完查dba_network_acl_privileges看到记录就以为好了,其实只是未提交的脏数据
ACL 修改后不 COMMIT、host 大小写不一致、resolve 权限漏掉、用小写用户名当 principal —— 这四点占了线上 ACL 配置失败的 80% 以上。配完别急着测接口,先查 SELECT * FROM dba_network_acls 和 dba_network_acl_privileges,确认记录存在且 PRINCIPAL 列是大写、HANDLER 值非空、HOST 匹配请求目标,再 COMMIT。











