概述
在迁移公司一个项目时,迁移完成后,在接口列表中发现出现“ORA-24247: 网络访问被访问控制列表 (ACL) 拒绝”的错误。
原因
Oracle 11g加入了一个访问控制列表(ACL)用来控制网络访问,在访问外部网络地址前需要进行配置。
Oracle允许使用几个PL/SQL API(UTL_TCP, UTL_SMTP, UTL_MAIL, UTL_HTTP和 UTL_INADDR)访问外部网络服务,这些API都使用TCP协议。
命令介绍
1. 查询网络访问控制列表ACL
Select * From dba_network_acls
2. 查询访问控制权限列表
Select * From dba_network_acl_privileges
3. 查询数据库中的用户,用户大小写敏感
Select username From dba_users Where username Like '%ITS%'
4. 分配ACL权限
begin dbms_network_acl_admin.create_acl ( -- 创建访问控制文件(ACL) acl => 'utl_http.xml', -- 文件名称 description => 'HTTP Access', -- 描述 principal => 'ITS', -- 授权或者取消授权账号,大小写敏感 is_grant => TRUE, -- 授权还是取消授权 privilege => 'connect', -- 授权或者取消授权的权限列表 start_date => null, -- 起始日期 end_date => null -- 结束日期 ); dbms_network_acl_admin.add_privilege ( -- 添加访问权限列表项 acl => 'utl_http.xml', -- 刚才创建的acl名称 principal => 'ITS', -- 授权或取消授权用户 is_grant => TRUE, -- 与上同 privilege => 'resolve', -- 权限列表 start_date => null, end_date => null ); dbms_network_acl_admin.assign_acl ( -- 该段命令意思是允许访问acl名为utl_http.xml下授权的用户,使用oracle网络访问包,所允许访问的目的主机,及其端口范围。 acl => 'utl_http.xml', host => '100.1.2.1', -- ip地址或者域名,填写http://localhost:9000/hello与http://localhost:9000/是会报host无效的 -- 且建议使用ip地址或者使用域名,若用localhost,当oracle不是安装在本机上的情况下,会出现问题 lower_port => 9000, -- 允许访问的起始端口号 upper_port => Null -- 允许访问的截止端口号 ); commit; end; begin dbms_network_acl_admin.assign_acl ( -- 可以授权多个主机,或者多个主机的多个端口 acl => 'utl_http.xml', host => '10.100.49.138', lower_port => 80, upper_port => NUll ); commit; end;
5. 移除ACL授权(与授权一一对应)
begin dbms_network_acl_admin.unassign_acl( acl => 'utl_http.xml', host => '100.1.2.1', lower_port => 9000, upper_port => Null ); dbms_network_acl_admin.delete_privilege( 'utl_http.xml', 'ITS', NULL, 'resolve' ); dbms_network_acl_admin.drop_acl( 'utl_http.xml' ); end;
解决方法
通过查询老数据库的ACL授权,在新数据库添加相应的ACL授权,业务系统恢复正常。
借鉴资料
Oracle ORA-24247: 网络访问被访问控制列表 (ACL) 拒绝
Oracle11g Http请求报错 ORA-24247: 网络访问被访问控制列表 (ACL) 拒绝 ORA-29273:HTTP 请求失败
二〇二〇年七月六日 09:18:05
评论区