2013-10-01 2 views
0
내가 SSL을 통해 LDAP 서버에 연결을 시도하고

을 가져온 후 SunCertPathBuilderException을 받고, 그리고 난 서버 인증서를 가지고하고 다음과 같이 설치 :아직도 인증서

keytool -keystore cacerts -importcert -alias ldapCert -file LdapCert.cer 

을하고 난 인증서가 성공적으로 메시지가 설치되었다, 그리고 난

keytool -list -keystore cacerts 

그리고 신뢰할 수있는 인증서 목록에서 인증서를 찾을 수 있습니다. cmd를에서 인증서를 설치 한 후

String host = "server.ip.here; 
     String userDN = "CN=myuser,OU=EmployeesOU,OU=MainOU,dc=mydomain,dc=net"; 
     String userPassword = "mypassword"; 
     boolean ssl = true; 

public static LdapContext connectToLdap(String host, 
      String userDN, String userPassword, 
      boolean ssl) throws Exception { 

     System.out.println("connectToLdap"); 

     String hostPrefix = "ldap"; 
     String ldapPort = "389"; 
     if (ssl) { 
      hostPrefix = "ldaps"; 
      ldapPort = "636"; 
     } 
     String providerUrl = hostPrefix + "://" + host + ":" + ldapPort; 
     //System.out.println("####### LDAP URL: " + providerUrl); 
     LdapContext ldapContext; 
     Hashtable<String, String> ldapEnv = new Hashtable<String, String>(11); 
     ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, 
       "com.sun.jndi.ldap.LdapCtxFactory"); 
     ldapEnv.put(Context.PROVIDER_URL, providerUrl); 
     ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple"); 
     ldapEnv.put(Context.SECURITY_PRINCIPAL, userDN); 
     ldapEnv.put(Context.SECURITY_CREDENTIALS, userPassword); 
     ldapEnv.put("com.sun.jndi.ldap.read.timeout", 1000 * 10 + ""); 
     if (ssl) { 
      ldapEnv.put(Context.SECURITY_PROTOCOL, "ssl"); 
     } 
     ldapEnv.put(Context.REFERRAL, "ignore"); 
     try { 
      ldapContext = new InitialLdapContext(ldapEnv, null); 
      System.out.println("success connection to ldap"); 
      return ldapContext; 
     } catch (Exception e) { 
      System.out.println("failure connection to ldap"); 
      e.printStackTrace(); 
      return null; 
     } 
    } 

, 그리고 난 여전히 예외 얻고 응용 프로그램 실행하려고 : 난에 노력

javax.naming.CommunicationException: simple bind failed: server.ip:636 [Root exception is javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target] 
     at com.sun.jndi.ldap.LdapClient.authenticate(LdapClient.java:197) 
     at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2694) 
     at com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:293) 
     at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:175) 
     at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:193) 
     at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:136) 
     at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:66) 
     at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667) 
     at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288) 
     at javax.naming.InitialContext.init(InitialContext.java:223) 
     at javax.naming.ldap.InitialLdapContext.<init>(InitialLdapContext.java:134) 
     at ldap.LDAPUtils.connectToLdap(LDAPUtils.java:58) 
     at Test.main(Test.java:43) 
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
     at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1623) 
     at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:198) 
     at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:192) 
     at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1074) 
     at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:128) 
     at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:529) 
     at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:465) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1120) 
     at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:744) 
     at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:75) 
     at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) 
     at java.io.BufferedInputStream.read1(BufferedInputStream.java:258) 
     at java.io.BufferedInputStream.read(BufferedInputStream.java:317) 
     at com.sun.jndi.ldap.Connection.run(Connection.java:808) 
     at java.lang.Thread.run(Thread.java:619) 
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
     at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:325) 
     at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:219) 
     at sun.security.validator.Validator.validate(Validator.java:218) 
     at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:126) 
     at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:209) 
     at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249) 
     at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1053) 
     ... 12 more 
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
     at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174) 
     at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238) 
     at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:320) 

을 내가 LDAP 서버에 연결하고 어떻게 여기

입니다 게시물에서와 같이 LDAP에 연결하기 전에 disableCertificateValidation 메소드를 사용하십시오. Java client certificates over HTTPS/SSL

그러나 동일한 예외도 있습니다.

왜이 오류가 계속 발생하는지 알려주세요.

답변

0

원인 1 : 두 개의 충돌 설치 JDK가 있고 그 중 하나를 제거하고 키를 다시 가져오고 모든 것이 정상적으로 작동합니다.

원인 2 : 내가

자바/JDK/JRE/lib 디렉토리/자바에 보안에게/JRE/lib 디렉토리/보안

에서 생성 된 cacerts 파일을 복사 한 몇 가지 테스트 시스템에서

원인 3 : websphere 서버에서 코드를 실행하는 경우 여기에 언급 된 wensphere의 키 저장소와 인증서를 구성해야합니다.

http://www-01.ibm.com/support/docview.wss?uid=swg21316850

2

JDK와 함께 제공되는 cacerts 파일을 수정하면 안됩니다. 그것을 복사하고 자신의 파일에 인증서를 추가하고 시스템 속성 javax.net.ssl.trustStore을 통해 JSSE에 알려주십시오.