2016-06-14 7 views
1

私は、LDAPに接続して検索するための情報(例えば、ホスト名、ベースDNなど)がCA証明書(「caCertificate」属性)を含む属性を取得できるメソッドを作成しようとしています。LDAPサーバー(Java)から証明書属性(caCertificate)を読み取る方法は?

私はこれを行う方法についていくつかの提案を見てきましたが、今のところ1つの作業を取得することができていない。

私はLDAP検索と検索を行うことができるよと思いますがされていません

ここでは、動作していると思われる部分のスニペットを示します。

 Date theReturnedDate = null; 
     String base = "ou=CAs,dc=test,dc=com"; 
     String filter = "(objectclass=CertificationAuthority)"; 

     System.out.println("In LDAPUpdate.checkReadLdap: Entering, theLdapCn = [" + theLdapCn + "]..."); 
    Hashtable envRead = new Hashtable(11); 
    envRead.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
    envRead.put(Context.PROVIDER_URL, "ldap://my.test.ldap:389"); 
    envRead.put(Context.SECURITY_AUTHENTICATION, "simple"); 
    envRead.put(Context.SECURITY_PRINCIPAL, "cn=admin,ou=people,dc=test,dc=com"); 
    envRead.put(Context.SECURITY_CREDENTIALS, "xxx"); 
    //specify attributes to be returned in binary format 
    envRead.put("java.naming.ldap.attributes.binary","caCertificate"); 


    SearchControls searchCtls = new SearchControls(); 
    //Specify the attributes to return 
    String returnedAtts[]={"caCertificate"}; 
    searchCtls.setReturningAttributes(returnedAtts); 

    DirContext ctx = null; 
     try 
    { 
     // Create the initial directory context 
     InitialDirContext initialContext = new InitialDirContext(envRead); 
     ctx = (DirContext)initialContext; 

     System.out.println("Context Sucessfully Initialized"); 

     SearchControls constraints = new SearchControls(); 
     constraints.setSearchScope(SearchControls.SUBTREE_SCOPE); 

     NamingEnumeration results = ctx.search(base, filter, constraints); 

     while(results != null && results.hasMore()) 
     { 
      SearchResult sr = (SearchResult) results.next(); 
      String dn = sr.getName() + "," + base; 
      System.out.println("Distinguished Name is " + dn); 

      Attributes ar = ctx.getAttributes(dn, returnedAtts); 

      if(ar == null) 
      { 
       System.out.println("Entry " + dn); 
       System.out.println(" has none of the specified attributes\n"); 
      } 
      else 
      { 
       System.out.println("In LDAPUpdate.readCheckLdap: returnedAtts.length=[" + returnedAtts.length + "]"); 
       for(int i=0; i<returnedAtts.length; i++) 
       { 
        Attribute attr = ar.get(returnedAtts[i]); 
        System.out.println(returnedAtts[i] + ":"); 

        for(Enumeration vals=attr.getAll(); vals.hasMoreElements();) 
        { 
         System.out.println("\t" + vals.nextElement()); 
        } 
       } 
      } 
     } 
    } 
    catch(Exception e) 
    { 
     System.err.println(e); 
    } 

私が必要とする、つまりCA証明書を返す属性を取得してX509Certificateオブジェクトに変換する方法を教えてもらえますか?

答えて

0

私が必要とする、つまりCA証明書で返される属性を取得してX509Certificateオブジェクトに変換する方法を教えてもらえますか?

このような何か:

import java.io.ByteArrayInputStream; 
import java.security.cert.*; 

CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
X509Certificate cert = (X509Certificate)cf.generateCertificate(new ByteArrayInputStream(bytes)); 

E & OE

+0

こんにちは - 「バイト」とは何ですか?私は 'attrs.get( "caCertificate")を実行することでそれを取得できますか?もしそうなら、あなたが提案したものを試してみると、 "コンストラクタのByteArrayInputStream(Attribute)は未定義です"というメッセージが表示されます。 – user555303

+0

'bytes'は' caCertificate'属性の値として得られるバイト配列です。私はそれが明らかだと思ったでしょう。 – EJP

1

私はそれが働いてしまったと思います!

記録的には、ここでは完全な動作例です。私はそこに役立つ可能性があるいくつかのデバッグコードを残しました。これはLDAPサーバーにバインドし、エントリを取得してcaCertificate属性をX509Certificateオブジェクトに抽出します。次に、X509CertificateのSubject DNを表示して、オブジェクトがインスタンス化されたことを確認します。

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.ObjectOutputStream; 
import java.security.cert.CertificateFactory; 
import java.security.cert.X509Certificate; 
import java.util.Hashtable; 

import javax.naming.Context; 
import javax.naming.NamingEnumeration; 
import javax.naming.directory.Attribute; 
import javax.naming.directory.Attributes; 
import javax.naming.directory.SearchControls; 
import javax.naming.directory.SearchResult; 
import javax.naming.ldap.InitialLdapContext; 
import javax.naming.ldap.LdapContext; 


public class GoodReadACertFromLdap{ 

public static void main(String[] args) { 

    System.out.println("This Java application demonstrates how to retrieve a caCertificate object from an LDAP server"); 

    Hashtable env = new Hashtable(11); 
    env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); 
    env.put(Context.PROVIDER_URL, "ldap://myldapserver:389/"); 
    env.put(Context.SECURITY_AUTHENTICATION, "simple"); 
    env.put(Context.SECURITY_PRINCIPAL, "cn=directory manager"); 
    env.put(Context.SECURITY_CREDENTIALS, "XXXX"); 
    Object cert = null; 
    Attributes attrs = null; 
    Attribute attr = null; 

     try { 
      LdapContext ctx = new InitialLdapContext(env, null); 
      ctx.setRequestControls(null); 
      NamingEnumeration<?> namingEnum = ctx.search("CN=mycert,ou=CAs,dc=whatever,dc=com", "(objectclass=*)", getSimpleSearchControls()); 
      while (namingEnum.hasMore()) { 
       SearchResult result = (SearchResult) namingEnum.next();  
       attrs = result.getAttributes(); 
       System.out.println(attrs.get("cn")); 
       cert = attrs.get("caCertificate;binary"); 
       System.out.println(cert); 
       System.out.println(attrs.get("objectclass")); 

      } 
      namingEnum.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     if (((Attribute)cert).size() == 0) { 
      System.out.println("The cert attribute was cert.size == 0!"); 
      System.exit(0); 
     } 

     System.out.println("The cert attribute cert.size was NOT 0, so will now try to make it into a certificate object!"); 
     System.out.println("The cert attribute cert.size was: [" + ((Attribute)cert).size() + "]"); 
     System.out.println("Here's cert again: [" + cert + "]"); 

     try { 
      X509Certificate certOut = null; 
      CertificateFactory cf = CertificateFactory.getInstance("X.509"); 

      attr = attrs.get("caCertificate;binary");  // get the caCertificate attribute so we can make a NamingEnumeration from it... 
      for (NamingEnumeration e = attr.getAll();e.hasMore();) { 
      try { 
       ByteArrayInputStream bais = new ByteArrayInputStream((byte[])e.next()); 
       certOut = (X509Certificate)cf.generateCertificate(bais); 
      } catch (Exception ex) { 
       System.out.println("While converting Attribute object to a X509Certificate, EXCEPTION = " + ex); 
      } // end catch() 
      } 

      System.out.println("certOut.getSubjectDN = [" + certOut.getSubjectDN() + "]"); 


     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

} // end main() 



private static SearchControls getSimpleSearchControls() { 
    SearchControls searchControls = new SearchControls(); 
    searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE); 
    searchControls.setTimeLimit(30000); 
    String[] attrIDs = {"cn", "caCertificate", "objectclass"}; 
    searchControls.setReturningAttributes(attrIDs); 
    return searchControls; 
} // end getSimpleSearchControls() 



} // end CLASS 
関連する問題