Oracle Wed ADI 致命错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle Wed ADI 致命错误相关的知识,希望对你有一定的参考价值。

使用启用宏的Excel表格时,出现以下错误提示,还请大佬帮忙解决
日志中的错误记录
最后查出问题的原因是系统缺少相应的程序,重装系统后解决

第二张图的提示是数据类型错误,ORACLE里面RAW类型的数据显示到C#里面要进行转换,转换函数是RAWTOHEX(GUID转成字符窜),HEXTORAW(字符窜转GUID)虽然值是一样的,但是数据类型变了,转换后是字符窜类型。VB我估计也是一样的,你先看看能不能解决。 参考技术A 儿童我录音了欲言又止看一下

ORA-28860: 使用 UTL_HTTP 时出现致命的 SSL 错误?

【中文标题】ORA-28860: 使用 UTL_HTTP 时出现致命的 SSL 错误?【英文标题】:ORA-28860: Fatal SSL error when using UTL_HTTP? 【发布时间】:2015-01-13 22:27:35 【问题描述】:

我们使用的是 Oracle 11g (11.2.0.3.0),在执行 UTL_HTTP 调用时收到以下错误:

EXCEPTION: ORA-28860: Fatal SSL error
EXCEPTION: ORA-06512: at "SYS.UTL_HTTP", line 1128
ORA-06512: at line 23

EXCEPTION: ORA-28860: Fatal SSL error

这是我们正在使用的代码:

DECLARE
  url_chr             VARCHAR2(500);
  user_id_chr         VARCHAR2(100);
  password_chr        VARCHAR2(20);
  wallet_path_chr     VARCHAR2(500);
  wallet_pass_chr     VARCHAR2(20);

  l_http_request      UTL_HTTP.REQ;
  l_http_response     UTL_HTTP.RESP; 
  l_text              VARCHAR2(32767);
BEGIN
  url_chr           := '*****';
  user_id_chr       := '*****';
  password_chr      := '*****';
  wallet_pass_chr   := '*****';
  wallet_path_chr   := 'file:/etc/ORACLE/WALLETS/astens/rtca/cer/';

  UTL_HTTP.SET_DETAILED_EXCP_SUPPORT(TRUE);    

  UTL_HTTP.SET_WALLET(wallet_path_chr, wallet_pass_chr);

  l_http_request  := UTL_HTTP.BEGIN_REQUEST(url_chr);
  UTL_HTTP.SET_AUTHENTICATION(r => l_http_request, username => user_id_chr, PASSWORD => password_chr);
  l_http_response := UTL_HTTP.GET_RESPONSE(l_http_request);

  DBMS_OUTPUT.PUT_LINE ('STATUS_CODE : ' || l_http_response.STATUS_CODE);

  BEGIN
    LOOP
      UTL_HTTP.READ_TEXT(l_http_response, l_text, 32766);
      DBMS_OUTPUT.PUT_LINE (l_text);
    END LOOP;
  EXCEPTION
    WHEN UTL_HTTP.END_OF_BODY THEN
      UTL_HTTP.END_RESPONSE(l_http_response);
  END;
EXCEPTION
  WHEN OTHERS THEN

    DBMS_OUTPUT.PUT_LINE('EXCEPTION: '||SQLERRM);
    DBMS_OUTPUT.PUT_LINE('EXCEPTION: '||DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);

    DBMS_OUTPUT.PUT_LINE('EXCEPTION: '||UTL_HTTP.GET_DETAILED_SQLERRM);
    UTL_HTTP.END_RESPONSE(l_http_response);
END;

我们已将提供的证书安装到 Oracle 钱包中,并且我们为不同的客户端使用相同的代码,没有问题。

有什么想法吗?

【问题讨论】:

第 23 行是您的身份验证:UTL_HTTP.SET_AUTHENTICATION(r => l_http_request, username => user_id_chr, PASSWORD => password_chr);会不会是用户/密码错误? 【参考方案1】:

您调用的站点可能会阻止通过过时的 SSLv3 协议进行连接,同时 Oracle DB 11.2.0.3 可能不支持更新的算法。

有这个已知的错误,但它显然会影响到 11.1 的版本:

使用 TLSv1 时 UTL_HTTP 包失败并出现 ORA-29273 ORA-28860(文档 ID 727118.1) https://support.oracle.com/epmos/faces/DocContentDisplay?_afrLoop=842518171804826&id=727118.1&_afrWindowMode=0&_adf.ctrl-state=142oqbz21t_4

最近在 11.2.0.4 上也注册了一个 bug 20323753,仍未修复。可能和你的情况一样。

【讨论】:

【参考方案2】:

您没有提及您的网络访问控制列表 (ACL) 授权,但在 Oracle 11g 中,您必须为要连接的主机和要使用的钱包设置 ACL。由于您没有提到“ORA-24247:访问控制列表 (ACL) 拒绝网络访问”错误,因此我假设该部分设置正确。

钱包 ACL 定义其位置并将针对钱包的权限授予用户。如果没有这些权限,即使您有正确的密码,Oracle 也不会打开钱包并将证书提供给 Web 服务器。钱包 ACL 是使用以下 PL/SQL 作为 SYS 运行创建的:

BEGIN
    UTL_HTTP.ASSIGN_WALLET_ACL (
       acl          => 'your_acl_name.xdb',
       wallet_path  => '/path/to/my/wallet/');
END;
/

钱包ACL创建后,用户必须拥有权限。

BEGIN
    DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(
        acl         => 'your_acl_name.xml',
        principal   => 'MY_USER',
        is_grant    =>  TRUE,
        privilege   => 'use-client-certificates');
END;
/

这将允许 Oracle 代表您的用户打开钱包并将证书提供给 Web 服务器。

【讨论】:

这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post。 也许它的措辞可以更直接,但我确实提供了一个答案。首先,我解释说“致命 SSL 错误”可能是 Oracle 没有提供客户端证书。其次,我解释说创建钱包 ACL 并授予用户特定权限将允许 Oracle 为该用户提供钱包并消除该错误。最后,我提供了一个快捷方式来测试 Oracle 和 Web 服务器之间的连接。我应该以更积极的方式重写吗? 事实上,它确实看起来像是问题、建议和 cmets 的组合,而不是一个答案。如果只是为了防止它被标记和删除为“不是答案”,最好以更类似于答案的方式重写它。【参考方案3】:

我想提供以下内容:

    创建一个 JAVA 函数

    CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "HttpSSLGet"
    AS
    import java.net.URL;
    import java.io.*;
    import javax.net.ssl.HttpsURLConnection;
    public class HttpSSLGet
    
      public static String GetSSL(final String url)
      
        StringBuffer buffer = new StringBuffer();
        try
        
          URL myUrl = new URL(url);
          HttpsURLConnection con = (HttpsURLConnection)myUrl.openConnection();
          InputStream ins = con.getInputStream();
          InputStreamReader isr = new InputStreamReader(ins);
          BufferedReader in = new BufferedReader(isr);
          String inputLine;
    
          while ((inputLine = in.readLine()) != null)
          
            buffer.append(inputLine);
          
          in.close();
        
        catch (Exception e)
        
          return buffer.toString() + "\n" + e.toString();
        
        return buffer.toString();
      
    
    

    创建一个 PL/SQL 包(独立函数)

    CREATE OR REPLACE PACKAGE PCK_HTTP AUTHID DEFINER
    AS
    
    function GetSSL(aUrl Varchar2) return Varchar2;
    
    END;
    /
    
    CREATE OR REPLACE PACKAGE BODY PCK_HTTP AS
    
    function GetSSL(aUrl Varchar2) return Varchar2 AS LANGUAGE JAVA
    NAME 'HttpSSLGet.GetSSL(java.lang.String) return java.lang.String';
    
    END;
    /
    

    Oracle 内置的 JAVA 机器有问题。它包含较少的证书作为标准的“satandalone” JAVA。可能,您应该将下载的证书添加到 built-in java machine(不是独立的 java),例如。在命令行中(Windows):

    keytool -import -alias geos -keystore 
    "d:\Oracle\product\11.2.0\dbhome_1\javavm\lib\security\cacerts" 
    -file example.com.cer -storepass changeit
    

    在查询或 PL/SQL 中使用函数,例如。

    SELECT PCK_HTTP.GetSSL('https://www.example.com') FROM DUAL
    

【讨论】:

【参考方案4】:

我们发现 https 网站钱包中的旧证书即使未过期也不再可用。在新钱包中使用新证书进行测试证明了这一点。删除旧证书并向原始钱包添加新证书解决了该问题。

【讨论】:

以上是关于Oracle Wed ADI 致命错误的主要内容,如果未能解决你的问题,请参考以下文章

使用oracle ebs 做数据编辑,web adi导出数据时,打开excel时报错,该怎么解决啊?

PHP致命错误:允许的内存大小为134217728字节已用尽

致命错误:调用未定义函数 oci_connect()

MS EXCEL2013添加Oracle Web ADI菜单

使用 CData 雪花源导出数据的 SSIS 块超时错误

CAD2014总是出现致命错误