Oracle Wed ADI 致命错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle Wed ADI 致命错误相关的知识,希望对你有一定的参考价值。
使用启用宏的Excel表格时,出现以下错误提示,还请大佬帮忙解决
日志中的错误记录
最后查出问题的原因是系统缺少相应的程序,重装系统后解决
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字节已用尽