You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为所有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调用验证有效
  • 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底层依赖的调用)使用指定钱包:

  1. 设置初始化参数(需重启数据库):

    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存在)。

  2. 会话级触发器(无需重启):
    创建触发器在用户会话启动时设置钱包:

    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_wallet
    
    输出中需看到Trusted Certificates包含serverCA的条目。
  • 确认服务器主机名serverA.com与证书中的CN(通用名称)完全匹配,避免主机名验证失败。
  • 检查钱包权限:确保Oracle用户对钱包目录和文件有读权限(执行chmod 700 /home/oracle/ords/https_wallet; chmod 600 /home/oracle/ords/https_wallet/*)。

内容的提问来源于stack exchange,提问作者ClarenceG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 23:16:26