2016-09-08 13 views
1

新しいMicrosoft ADFSサーバーに切り替えたので、LDAPS(ポート636でSSL上のLDAP)を使用する必要があります。しかし、PL/SQLパッケージで(hereに基づく)にDBMS_LDAP.open_sslを追加することによって、私が取得: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でサポートされていません。私も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) 

オラクルの知識がパッチ「19285025」であるので、多くの人が持っていたし、この問題(ドキュメントID 19285025.8、ドキュメントID 1561121.1)とだけアドバイスを持って示しています。私たちはこのパッチを実行しましたが、まだ進歩はありません。私たちは、Secure Sockets Layerをどのように設定し、 "netmagr"の助けを借りて暗号スイートを追加するのかを示すOracleドキュメント(here)を見つけましたが、最終的にこれはOracle DB接続のためだけだとわかりましたが、 今質問がありますか? 1. DBMS_LDAP.open_sslのこの "SSLハンドシェイクが失敗しました"を解決するにはどうすればよいですか? DBMS_LDAP.open_ssl用に異なる暗号スイートを設定する方法は? 2. LDAPSを使用するための代替PL/SQLパッケージはありますか?または、Javaパッケージを使用してDBにロードする必要がありますか?

+0

スタックオーバーフローは、プログラミングや開発の質問のためのサイトです。この質問は、プログラミングや開発に関するものではないので、話題にはならないようです。ヘルプセンターの[ここではどのトピックを参照できますか](http://stackoverflow.com/help/on-topic)を参照してください。おそらく、[スーパーユーザ](http://superuser.com/)や[Unix&Linux Stack Exchange](http://unix.stackexchange.com/)の方が良いかもしれません。また、[Dev Opsについての質問はどこに投稿しますか?](http://meta.stackexchange.com/q/134306) – jww

+0

敬意を表して、 ** PL/SQL **プログラミングで。また、私はJavaプロシージャを使用して見つけた代替ソリューションについて尋ねました。 – ATK

答えて

1

私はOracle DBMS_LDAPではなくJavaプロシージャに切り替えました。それはうまく動作し、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; 
関連する問題