本地搭建APEX环境,访问RestAPI数据源会有如下报错,按照该步骤设置可以解决这些报错。
ORA-29273: HTTP request failed
ORA-29024: Certificate validation failure
ORA-06512: at "SYS.UTL_HTTP", line 380
设置oracle钱包(wallet)
- 创建钱包,本例钱包为
https_wallet
orapki wallet create -wallet https_wallet -pwd Demo_123 -auto_login
-
导出网站根证书,并且上传到数据库服务器中
-
将证书CA导入到钱包中
orapki wallet add -wallet https_wallet -cert DigiCertGlobalRootCA.crt -trusted_cert -pwd Demo_123
设置网络访问控制(ACL)
如果Oracle版本为12以上,请按照如下方法设置,中文资料中会搜索到很多使用已经废弃的ACL设置资料,清晰请参考以下官方文档。
DBMS_NETWORK_ACL_ADMIN
- 将主机
*.github.com
的连接和解析权限授予APEX用户APEX_230100
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => '*.github.com',
ace => xs$ace_type(privilege_list => xs$name_list('connect', 'resolve'),
principal_name => 'APEX_230100',
principal_type => xs_acl.ptype_db));
COMMIT;
END;
- 将您创建的钱包的use_client_certificates和use_passwords权限授予APEX用户
APEX_230100
BEGIN
dbms_network_acl_admin.append_wallet_ace(
wallet_path => 'file:/home/oracle/https_wallet',
ace => xs$ace_type(privilege_list => xs$name_list('use_client_certificates', 'use_passwords'),
principal_name => 'APEX_230100',
principal_type => xs_acl.ptype_db));
END;
- 查看授权信息
select * from DBA_HOST_ACES
如果需要的话,可以使用以下脚本删除访问授权
BEGIN
dbms_network_acl_admin.remove_host_ace(
host => '*.github.com',
ace => xs$ace_type(privilege_list => xs$name_list('resolve', 'connect'),
principal_name => 'APEX_230100',
principal_type => xs_acl.ptype_db));
END;
设置APEX默认钱包路径
- 使用
ADMIN
账号登录INTERNAL
空间 - 依次进入Manage Instance -> Instance Settings -> Wallet
- 将Wallet Path设置为自行定义的值
file:///home/oracle/https_wallet
验证结果
执行如下SQL,能够正常查询到数据,如果APEX设置了默认钱包,则p_wallet_path参数可以省略。
select apex_web_service.make_rest_request(
p_url => 'https://api.github.com',
p_http_method => 'GET',
p_wallet_path => 'file:///home/oracle/https_wallet' ) from dual;
参考文章:Application Express and HTTPS: Never see “Certificate Validation Error” again