gpt4 book ai didi

PL/SQL 中的 Oracle DBMS_LDAP.open_ssl 显示错误 : ORA-31202: SSL handshake failed

转载 作者:行者123 更新时间:2023-12-02 00:43:02 25 4
gpt4 key购买 nike

我们已切换到新的 Microsoft ADFS 服务器,现在我们必须使用 LDAPS(端口 636 上基于 SSL 的 LDAP)。但是,在 PL/SQL 包中,通过添加 DBMS_LDAP.open_ssl (基于 here )我得到:

ORA-31202:DBMS_LDAP:LDAP 客户端/服务器错误:SSL 握手失败

我的故障排除指导我对连接进行 tcpdump 调试,我发现 Oracle (12.1.0.2) DBMS_LDAP 在 SSL 握手上仅使用以下三个密码套件,这些套件都非常旧且不安全,并且不受最新 Microsoft AD 支持。即使我尝试使用 ldap.google.com:636 尝试另一个 12c db (12.1.0.2.0) 并收到相同的错误和相同的密码套件。

Version: TLS 1.2 (0x0303)
Cipher Suite: TLS_DH_anon_WITH_3DES_EDE_CBC_SHA (0x001b)
Cipher Suite: TLS_DH_anon_WITH_RC4_128_MD5 (0x0018)
Cipher Suite: TLS_EMPTY_RENEGOTIATION_INFO_SCSV (0x00ff)

Oracle知识显示很多人都遇到过这个问题(文档ID 19285025.8,文档ID 1561121.1),唯一的建议是补丁“19285025”。我们已经完成了这个补丁,但仍然没有任何进展。我们发现Oracle文档(here)展示了如何配置安全套接字层并通过“netmagr”的帮助添加密码套件,但最终即使我知道这仅适用于oracle DB连接,但它并没有受到影响。现在的问题是?1.如何解决DBMS_LDAP.open_ssl出现“SSL握手失败”的问题?如何为DBMS_LDAP.open_ssl设置不同的密码套件? 2. 有任何使用 LDAPS 的替代 PL/SQL 包吗?或者我们必须使用Java包并将其加载到数据库中?

最佳答案

我已切换到 java 过程而不是 Oracle DBMS_LDAP。它运行良好,不再有 SSL 问题(除了 java 的扩展能力)。

    SET SERVEROUTPUT ON SIZE 5000;
CALL dbms_java.set_output(5000);

CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED LDAP AS
import javax.naming.*;
import javax.naming.directory.*;
import java.util.Hashtable;
/**
* Java LDAP Package by ATK, 9/9/2016
*/
class ldap {
public static int ldap_auth(String username, String my_password, String ldap_server) {

Hashtable env = new Hashtable(11);
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, ldap_server ); //example "ldap://ldap.yourcompany.com:636"

env.put(Context.SECURITY_PROTOCOL, "ssl");

env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "uid=" + username + ",OU=users,DC=company,DC=com");
env.put(Context.SECURITY_CREDENTIALS, my_password);

try {
// Create initial context
DirContext ctx = new InitialDirContext(env);

System.out.println("Connection Successful.");

ctx.close();
return 0;
} catch (NamingException e) {
System.out.println("LDAP Connection: FAILED");
e.printStackTrace();
return -1;
}
}
};

--show errors java source ldap ; -- to check class compile

CREATE OR REPLACE FUNCTION ldap_auth (username in varchar2, my_password in varchar2, ldap_server in varchar2) RETURN NUMBER
AS LANGUAGE JAVA
NAME 'ldap.ldap_auth (java.lang.String, java.lang.String, java.lang.String) return int';


call dbms_java.grant_permission( 'MySchema', 'SYS:java.net.SocketPermission', 'ldap.companyDomain.com', 'resolve' );
call dbms_java.grant_permission( 'MySchema', 'SYS:java.net.SocketPermission', 'ldapqa.companyDomain.com', 'resolve' );
call dbms_java.grant_permission( 'MySchema', 'SYS:java.net.SocketPermission', 'ldapdev.companyDomain.com', 'resolve' );
call dbms_java.grant_permission( 'MySchema', 'SYS:java.net.SocketPermission', '10.14.10.53:636', 'connect,resolve' );
call dbms_java.grant_permission( 'MySchema', 'SYS:java.net.SocketPermission', '10.14.10.54:636', 'connect,resolve' );
call dbms_java.grant_permission( 'MySchema', 'SYS:java.net.SocketPermission', '10.14.10.55:636', 'connect,resolve' );

现在您可以使用以下方法进行测试:

SET SERVEROUTPUT ON SIZE 5000
CALL dbms_java.set_output(0);
declare
l_ret int ;
begin
l_ret := ldap_auth ('myUser', 'myPassword', 'ldap://lds.companyDomain.com:636');
DBMS_OUTPUT.put_line('Return = ' || l_ret );
end;

关于PL/SQL 中的 Oracle DBMS_LDAP.open_ssl 显示错误 : ORA-31202: SSL handshake failed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39381036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com