为所有APEX REST请求配置Oracle Wallet,解决RESS证书验证失败问题
自签名证书环境下配置RESS跨服务器引用的证书验证问题解决
环境配置
- serverA:Oracle + APEX 20.2 + ORDS 20.3
- 生成自签名CA证书
serverCA.crt,并用其签发ORDS的SSL证书server.crt,已通过HTTPS正常访问ORDS/RESS端点,curl调用验证有效
- 生成自签名CA证书
- serverB:Oracle + APEX 23.2 + ORDS 23.4
- 用
orapki创建钱包并导入serverCA.crt,在APEX中创建凭证ress_creds用于RESS引用配置
- 用
验证步骤与问题
成功场景
在serverB的SQL Workshop执行以下PL/SQL代码,可正常调用serverA的RESS端点,说明钱包和凭证本身有效:
declare lclob clob; BEGIN apex_web_service.set_request_headers( p_name_01 => 'Content-Type', p_value_01 => 'application/sql' ); lclob := APEX_WEB_SERVICE.MAKE_REST_REQUEST ( p_url => 'https://serverA.com/ords/myschema/_/sql', p_http_method => 'POST' ,p_body => 'select * from emp' ,p_wallet_path => 'file:///home/oracle/ords/https_wallet' ,p_credential_static_id => 'ress_creds' ); dbms_output.put_line(lclob); end;
失败场景
在serverB创建以https://serverA.com/ords/myschema为端点、关联ress_creds凭证的RESS引用后,测试时抛出错误:ORA-29024: Certificate validation failure。尝试执行exec utl_http.set_wallet('file:/home/oracle/ords/https_wallet', null);(钱包已配置自动登录),问题未解决。
解决方案
方案1:全局配置UTL_HTTP钱包
通过数据库初始化参数或触发器全局设置钱包路径,确保所有UTL_HTTP调用(包括RESS底层依赖的调用)使用指定钱包:
设置初始化参数(需重启数据库):
ALTER SYSTEM SET UTL_HTTP_CW_BYPASS = TRUE SCOPE=SPFILE; ALTER SYSTEM SET WALLET_ROOT = '/home/oracle/ords' SCOPE=SPFILE; ALTER SYSTEM SET UTL_HTTP_WALLET = 'https_wallet' SCOPE=SPFILE;注意:
WALLET_ROOT是12c+的参数,需确保目录存在且Oracle用户有读写权限,钱包需配置自动登录(cwallet.sso存在)。会话级触发器(无需重启):
创建触发器在用户会话启动时设置钱包:CREATE OR REPLACE TRIGGER SET_UTL_WALLET AFTER LOGON ON DATABASE BEGIN UTL_HTTP.SET_WALLET('file:///home/oracle/ords/https_wallet', NULL); END; /需确保触发器执行用户有
EXECUTE权限在UTL_HTTP上。
方案2:在RESS引用中显式指定钱包路径
APEX的RESS引用配置默认不会自动关联钱包路径,需通过自定义PL/SQL包装器调用RESS,显式传入钱包参数:
CREATE OR REPLACE FUNCTION CALL_RESS_REFERENCE(p_sql IN VARCHAR2) RETURN CLOB IS l_response CLOB; BEGIN apex_web_service.set_request_headers( p_name_01 => 'Content-Type', p_value_01 => 'application/sql' ); l_response := apex_web_service.make_rest_request( p_url => 'https://serverA.com/ords/myschema/_/sql', p_http_method => 'POST', p_body => p_sql, p_wallet_path => 'file:///home/oracle/ords/https_wallet', p_credential_static_id => 'ress_creds' ); RETURN l_response; END; /
后续通过调用此函数替代直接使用RESS引用,确保每次调用都传入正确的钱包参数。
方案3:检查钱包与证书配置
- 确认
serverCA.crt已被添加为信任证书而非用户证书:
输出中需看到orapki wallet display -wallet /home/oracle/ords/https_walletTrusted Certificates包含serverCA的条目。 - 确认服务器主机名
serverA.com与证书中的CN(通用名称)完全匹配,避免主机名验证失败。 - 检查钱包权限:确保Oracle用户对钱包目录和文件有读权限(执行
chmod 700 /home/oracle/ords/https_wallet; chmod 600 /home/oracle/ords/https_wallet/*)。
内容的提问来源于stack exchange,提问作者ClarenceG
相关产品推荐
相关产品推荐

