2016-09-08 3 views
1

새 Microsoft ADFS 서버로 전환 했으므로 LDAPS (포트 636에서 SSL을 통한 LDAP)를 사용해야합니다. 그러나 (here 기준) DBMS_LDAP.open_ssl를 추가하여 PL/SQL 패키지로 내가 얻을 :PL/SQL의 Oracle DBMS_LDAP.open_ssl에 오류가 있습니다. ORA-31202 : SSL 핸드 셰이크가 실패했습니다.

ORA-31202: DBMS_LDAP: LDAP client/server error: SSL handshake failed

내 문제 해결이 연결의 tcpdump를 디버그 할 저를 인도하고 나는 오라클을 발견

(12.1.0.2) DBMS_LDAP를 SSL 핸드 셰이크에서 3 개 이하의 암호 스위트 만 사용하십시오.이 모두는 매우 오래되었고 안전하지 않으며 최신 Microsoft AD에서 지원하지 않습니다. 심지어 나는 다른 12c db (12.1.0.2.0)에서 ldap.google.com:636으로 시도했지만 동일한 오류 및 동일한 암호 스위트를 받았습니다.

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) 

오라클 지식 패치 "19285025"그래서 많은 사람들이 있었고,이 문제 (문서의 ID 19285025.8, 문서의 ID 1561121.1) 만 조언을 보여줍니다. 우리는이 패치를했지만 여전히 진전이 없습니다. 오라클 문서 (here)에서 Secure Sockets Layer를 구성하고 "netmagr"을 사용하여 암호 스위트를 추가하는 방법을 보여주었습니다. 그러나 결국 이것은 오라클 DB 연결에만 해당되는 것으로 알고 있지만 영향을 미치지는 않습니다. 이제 질문이 있습니까? 1. DBMS_LDAP.open_ssl에 대해이 "SSL 핸드 셰이크 실패"를 해결하는 방법은 무엇입니까? DBMS_LDAP.open_ssl에 대해 다른 암호 모음을 설정하는 방법은 무엇입니까? 2. LDAPS를 사용하기위한 대체 PL/SQL 패키지는 무엇입니까? 또는 Java 패키지를 사용하여 DB에로드해야합니까?

+0

스택 오버플로가 프로그래밍 및 개발 질문을위한 사이트입니다. 이 질문은 프로그래밍이나 개발이 아니기 때문에 주제와는 거리가 먼 것처럼 보입니다. 도움말 센터에서 [여기에서 내가 질문 할 수있는 항목은 무엇입니까?] (http://stackoverflow.com/help/on-topic)를 참조하십시오. 아마도 [Super User] (http://superuser.com/) 나 [Unix & Linux Stack Exchange] (http://unix.stackexchange.com/)가 더 나은 곳이 될 것입니다. 또한 [Dev Ops에 관한 질문을 게시 할 곳은 어디입니까?] (http://meta.stackexchange.com/q/134306) – jww

+0

존경하는 한, 전체 스토리는 LDAPS 사용에 관한 내용이므로 ** 프로그래밍 문제 **라고 생각합니다. ** PL/SQL ** 프로그래밍. 또한 자바 프로 시저를 사용하여 발견 한 대체 솔루션에 대해 물어 보았고 곧 내 대답을 올릴 것입니다. – ATK

답변

1

Oracle DBMS_LDAP 대신 Java 프로 시저로 전환했습니다. 그것은 잘 작동하고 더 이상 SSL 문제 (그것을 확장하기위한 자바의 힘 옆에).

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;