Peter Nack: SSL schlaegt fehl mit self-signed Certificate unter OpenDS

Tach allerseits,

ich kaempfe nun schon seit Tagen mit dem Problem herum mich via Java ueber einen sicheren Port an einen LDAP-Server zu verbinden.
Meine Probleme liegen glaube ich im allgemeinen Verstaendnis was SSL/Keystore/TrustStore angeht.

Lokal konnte ich es bisher bereits einmal zum Laufen bekommen. Allerdings kann ich die Schritte nicht mehr reproduzieren, da ich einfach so lange mit allem moeglichem rumgespielt habe, bis es auf einmal funktionierte ;-(

Im Netzt verweisen viele Dokumente auf die "SSL-Handshake Exception-Bibel".
http://blogs.sun.com/andreas/entry/no_more_unable_to_find
Doch auch dies konnte mich nicht weiter bringen. Auch an die direkt unter Sun angegebenen Schritte habe ich mich exakt gehalten. Doch auch hier leider ohne Erfolg.
http://java.sun.com/j2se/1.5.0/docs/guide/security/jsse/JSSERefGuide.html

Ich weiss, normalerweise erwartet man jetzt von mir, dass ich anhand von Beispielen beschreibe, was ich schon alles gemacht habe und wo genau ich gescheitert bin. Aber ich kann nur sagen, ich habe bereits so gut wie alles ausprobiert und drehe mich mitterweile nur noch im Kreis.

Der aktuelle Stand ist der, dass unten stehender Code lokal wunderbar funktioniert. Den Keystore habe ich mittels keytool erstellen lassen und dem trusted Store hinzugefuegt.
Versuche ich mich jetzt allerdings nicht lokal, sondern gegen das OpenDS meines Testservers zu authentifiezieren, so bekomme ich untern aufgefuehrte Exception.

Vielleicht hat ja der eine oder andere hier bereits mit diesem Fehler zu tun gehabt und kann mir evtl. ein paar Tipps geben. Ich waere fuer jede noch so kleine Loesung dankbar.

import java.io.*;  
import java.net.URL;  
import java.security.*;  
import java.security.cert.*;  
import java.util.Properties;  
import javax.naming.Context;  
import javax.naming.directory.InitialDirContext;  
import javax.net.ssl.*;  
  
public class Start {  
 public static void main(String[] args) {  
   Properties envSSL = new Properties();  
   Properties env = new Properties();  
  
   System.setProperty( "javax.net.debug","handshake");  
  
   // SSL  
   envSSL.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");  
   envSSL.put(Context.PROVIDER_URL, "LDAPS://localhost:1636/");  
   // klappt nicht  
   // envSSL.put(Context.PROVIDER_URL, "LDAPS://vcgtestsrv:1636/");  
   envSSL.put(Context.SECURITY_PROTOCOL, "ssl");  
   envSSL.put(Context.SECURITY_AUTHENTICATION, "simple");  
   envSSL.put(Context.SECURITY_PRINCIPAL, "cn=Directory Manager");  
   envSSL.put(Context.SECURITY_CREDENTIALS, "mypwd");  
  
   //Normal  
   env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");  
   env.put(Context.PROVIDER_URL, "LDAP://localhost:389/");  
   env.put(Context.SECURITY_AUTHENTICATION, "simple");  
   env.put(Context.SECURITY_PRINCIPAL, "cn=Directory Manager");  
   env.put(Context.SECURITY_CREDENTIALS, "mypwd");  
  
   String keystore = "config/mykeystore";  
   System.setProperty( "javax.net.ssl.trustStore", keystore  );  
  
   InitialDirContext dirCtx = null;  
  
   try {  
    dirCtx = new InitialDirContext(envSSL);  
    System.err.println("EVERYTHING WENT FINE");  
   } catch (Exception e) {  
    System.err.println("SHIT DAMN IT");  
    e.printStackTrace();  
   }  
}
javax.naming.CommunicationException: simple bind failed: vcgtestsrv1636 [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(Unknown Source)  
	at com.sun.jndi.ldap.LdapCtx.connect(Unknown Source)  
	at com.sun.jndi.ldap.LdapCtx.<init>(Unknown Source)  
	at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(Unknown Source)  
	at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(Unknown Source)  
	at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(Unknown Source)  
	at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(Unknown Source)  
	at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)  
	at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)  
	at javax.naming.InitialContext.init(Unknown Source)  
	at javax.naming.InitialContext.<init>(Unknown Source)  
	at javax.naming.directory.InitialDirContext.<init>(Unknown Source)  
	at Start.main(Start.java:98)  
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(Unknown Source)  
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source)  
	at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)  
	at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)  
	at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source)  
	at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)  
	at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)  
	at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source)  
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)  
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)  
	at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readDataRecord(Unknown Source)  
	at com.sun.net.ssl.internal.ssl.AppInputStream.read(Unknown Source)  
	at java.io.BufferedInputStream.fill(Unknown Source)  
	at java.io.BufferedInputStream.read1(Unknown Source)  
	at java.io.BufferedInputStream.read(Unknown Source)  
	at com.sun.jndi.ldap.Connection.run(Unknown Source)  
	at java.lang.Thread.run(Unknown Source)  
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(Unknown Source)  
	at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)  
	at sun.security.validator.Validator.validate(Unknown Source)  
	at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(Unknown Source)  
	at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)  
	at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)  
	... 13 more  
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target  
	at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)  
	at java.security.cert.CertPathBuilder.build(Unknown Source)  
	... 19 more

Pfade, Passwoerter, Servernamen, Ports etc. stimmen alle und sind korrekt. Die normale Verbindung (also nicht ueber SSL) funktioniert einwandfrei. Die OpenDS-Server sind beide identisch konfiguriert und lauschen an dem Port 1636. Ich nutze die JRE aus dem JDK 1.6.0_16. OpenDS nutze ich in der Version 2.2.0.

Mfg
Peter

  1. Hallo,

    [code lang=sql]javax.naming.CommunicationException: simple bind failed: vcgtestsrv1636 [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]

    der Tipp hier: http://blogs.sun.com/gc/entry/unable_to_find_valid_certification  hat nicht funktioniert?

    Pfade, Passwoerter, Servernamen, Ports etc. stimmen alle und sind korrekt.

    Nicht ganz. Laut Fehlermeldung ist der Zertifizierungspfad nicht korrekt ;-)

    Grüße

    1. Hallo Blablub,

      danke fuer deine Antwort!

      der Tipp hier: http://blogs.sun.com/gc/entry/unable_to_find_valid_certification  hat nicht funktioniert?

      Nein, das hat mir auch nicht weitergeholfen. Die Seite beschaeftigt sich uebrigens mit dem gleichen Tool, welches auch ich verlinkt hatte (InstallCert).

      ABER: Ich konnte das Problem soeben loesen *;-)*
      Es war zum verrueckt werden. Im Endeffekt lag es tatsaechlich an Versionskonflikten. Diese aufzufinden war wirklich eine nervtoetende Angelegenheit, da hier recht viele Komponenten zusammen agieren (Java, Grails, OpenDS, Glassfish). Aber jetzt laeufts.

      Dennoch tausend Dank. Ich bin jetzt gluecklich ;-p

      MfG
      Peter