2013-05-30 2 views
1

나는 Java에서 노래를 부르고 AD에서 암호를 변경하려고합니다. 인증서를 서버로 가져 왔지만 인증서에 오류가 있습니다.SSL 암호 변경에 대한 SSL 인증서

가져 오기의 유효한 :

keytool -import -keystore "C:\Program Files\Java\jre6\lib\security\cacerts" -trustcacerts -alias openldap -file "C:\certnew.cer" 

목록의 유효한 :

keytool -list -keystore "C:\Program Files\Java\jre6\lib\security\cacerts" 

내 코드 :

public class PassChange 
{ 
    public static void main (String[] args) { 

    Hashtable env = new Hashtable(); 
    String userName = "CN=optimus,DC=ad,DC=euclid,DC=com"; 

    String oldPassword = "euclid!23"; 
    String newPassword = "kcube!23"; 

    //Could also do this via command line java -Djavax.net.ssl.trustStore.... 

    String keystore = "C:\\Program Files\\Java\\jre6\\lib\\security\\cacerts"; 

    // 1 String keystore = "C:\\Program Files\\Java\\jre6\\lib\\security\\cacerts"; 
    // 2 String keystore = "C:\\Program Files\\Java\\jre6\\lib\\security\\cacerts.jks"; 
    // 3 String keystore = "c:\\"; 
    // 1,2,3 all error 

    System.setProperty("javax.net.ssl.trustStore", keystore); 

    env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); 
    //set security credentials, note using simple cleartext authentication 
    env.put(Context.SECURITY_AUTHENTICATION,"simple"); 
    env.put(Context.SECURITY_PRINCIPAL,userName); 
    env.put(Context.SECURITY_CREDENTIALS,oldPassword); 

    //specify use of ssl 
    env.put(Context.SECURITY_PROTOCOL,"ssl"); 

    //connect to my domain controller 
    String ldapURL = "ldaps://xxx.xxx.xxx.xxx:636"; 
    env.put(Context.PROVIDER_URL,ldapURL); 

    try { 

     // Create the initial directory context 
     LdapContext ctx = new InitialLdapContext(env,null); 

     //change password is a single ldap modify operation 
     //that deletes the old password and adds the new password 
     ModificationItem[] mods = new ModificationItem[2]; 
     String oldQuotedPassword = "\"" + oldPassword + "\""; 
     byte[] oldUnicodePassword = oldQuotedPassword.getBytes("UTF-16LE"); 
     String newQuotedPassword = "\"" + newPassword + "\""; 
     byte[] newUnicodePassword = newQuotedPassword.getBytes("UTF-16LE"); 

     mods[0] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, new BasicAttribute("unicodePwd", oldUnicodePassword)); 
     mods[1] = new ModificationItem(DirContext.ADD_ATTRIBUTE, new BasicAttribute("unicodePwd", newUnicodePassword)); 

     ctx.modifyAttributes(userName, mods); 

     System.out.println("Changed Password for: " + userName);  
     ctx.close(); 

    } 
    catch (NamingException e) { 
     System.err.println("Problem changing password: " + e); 
    } 
    catch (UnsupportedEncodingException e) { 
     System.err.println("Problem encoding password: " + e); 
    } 
} 
} 

오류 메시지 :

페이지 패스워드 변경의 맹점 : javax.naming.CommunicationException : 단순한 바인드 실패 : xxx.xxx.xxx.xxx : 636 [루트 예외는 javax.net.ssl.SSLHandshakeException : sun.security.validator.ValidatorException : PKIX 패스 구축에 실패했습니다. security.provider.certpath.SunCertPathBuilderException : 요청한 대상에 대한 유효한 인증 경로를 찾을 수 없습니다.

+0

SSL 인증서의 문제점을 분석하려면 추가 등록 정보 javax.net.debug = all을 사용하여 프로그램을 실행하십시오. 그런 다음 게시물을 디버깅 결과로 업데이트하십시오. http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/ReadDebug.html도 참조하십시오. – Matej

+0

javax.net.debug = 모든 모드 ............. 마지막 줄 오류 ------------------------- closeSocket()이라고하는 thread-0 Thread-0, 예외 처리 : javax.net.ssl.SSLHandshakeException : sun.security.validator.ValidatorException : PKIX 패스 구축 실패 : sun.security.provider.certpath.SunCertPathBuilderException : 요청한 대상에 대한 유효한 인증 경로를 찾을 수 없습니다. – user2436284

답변

0

어떤 인증서를 가져 왔습니까? 당신은 서버 인증서를 원하지 않습니다. 오히려 인증 기관의 공개 키를 원합니다. 특히 -trustcacerts 스위치는 이것이 CA 공개 키임을 나타냅니다.

이름으로 짐작하면 서버의 인증서를 가져온 것이 아닌가 궁금합니다.

+0

응답 감사합니다^^ 서버 인증서가 있습니다. 서버에서 클라이언트로 복사본을 사용하는 인증서를 발급했습니다. 그렇다면 인증 기관의 공개 키가 필요합니까? – user2436284

+0

@ user2436284 클라이언트는 SSL을 통한 LDAP 액세스를 위해 JRE의 cacerts 파일에 CA에 대한 신뢰할 수있는 CA 인증서가 있어야합니다. 가져 오기 중 keytool 스위치가 중요합니다. '-trustcacerts' – geoffc