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

Oracle 12c与Salesforce REST API集成遇ORA-24263证书匹配问题求助

ORA-24263 错误排查:Oracle 12c 与 Salesforce 集成证书不匹配问题

环境与问题概述

  • 数据库版本:Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
  • 集成方式:使用apex_web_service.make_rest_request调用Salesforce REST API,通过APEX_JSON解析响应
  • 核心问题:此前通过更新p_https_host为证书CommonName、导入新证书到Oracle钱包的流程可正常工作,近期证书变更后执行请求抛出错误:

ORA-24263: Certificate of the remote server does not match the target address.

示例请求代码:

apex_web_service.make_rest_request (
                p_url           => '/sobjects/'||SOBJECT_API_NAME||'/'||RECORD_ID'
                ,p_http_method  => 'GET'
                ,p_body         => pReqBody
                ,p_wallet_path  => lWalletPath
                ,p_https_host   => HTTPSHOST
            );

注:代码中RECORD_ID'存在语法错误(多余单引号),建议先修正。

排查方向与调试建议

1. 验证证书CommonName与请求目标的匹配性

  • 直接在数据库服务器上执行openssl s_client -connect <salesforce_host>:443,抓取服务器返回的证书,查看Subject: CN=字段,对比你设置的HTTPSHOST值是否完全一致,避免浏览器下载证书时的格式或内容偏差。
  • 注意Salesforce证书可能使用通配符(如*.salesforce.com),需确保p_https_host的格式符合通配符匹配规则,比如不能用xxx.salesforce.com对应*.salesforce.com之外的其他格式。

2. 检查Oracle钱包内证书的完整性

  • 使用orapki wallet display -wallet <wallet_path>命令查看钱包内证书列表,确认新证书已正确导入,旧证书已移除(若为替换场景)。
  • 导入完整证书链:Salesforce的证书依赖中间CA证书,仅导入服务器端crt文件会导致验证失败,需将根CA、中间CA证书一并导入钱包。

3. 确认请求目标与p_https_host的一致性

  • 检查p_url是否为完整URL:示例中使用的是相对路径,需确认apex_web_service实际请求的主机地址与p_https_host完全匹配,避免其他配置(如请求头中的Host)覆盖导致地址不匹配。
  • 修正代码中的字符串拼接错误:示例中RECORD_ID'多了一个单引号,可能导致拼接后的URL异常,进而触发证书匹配错误。

4. 验证钱包路径与权限

  • 确认lWalletPath指向的路径正确,数据库进程对该路径及钱包文件(ewallet.p12/cwallet.sso)有读权限,建议将钱包文件权限设为600,属主为oracle用户。
  • 若使用自动登录钱包,确保cwallet.sso文件存在且未损坏,可尝试重建钱包时添加-auto_login参数:orapki wallet create -wallet <path> -auto_login -pwd <password>。

5. 用UTL_HTTP做基础连接测试

  • 排除APEX配置干扰,直接用UTL_HTTP测试HTTPS连接,验证证书和钱包配置是否正常:
DECLARE
    l_req UTL_HTTP.REQ;
    l_resp UTL_HTTP.RESP;
BEGIN
    UTL_HTTP.SET_WALLET('file:<你的钱包路径>', '<钱包密码>');
    l_req := UTL_HTTP.BEGIN_REQUEST('https://<Salesforce目标主机>');
    UTL_HTTP.SET_HEADER(l_req, 'Host', '<Salesforce目标主机>');
    l_resp := UTL_HTTP.GET_RESPONSE(l_req);
    UTL_HTTP.END_RESPONSE(l_resp);
    DBMS_OUTPUT.PUT_LINE('连接成功');
EXCEPTION
    WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('错误信息: ' || SQLERRM);
END;
/

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:33:22