Apache Directory LDAP API und SSL

Nach längerem suchen und ausprobieren, habe ich mich für die Apache Directory LDAP API Library entschieden. Sie ist einfach, verständlich und klar strukturiert, und sie eignet sich hervorragend für Spring und OSGI. In diesem kurzen Post möchte ich zeigen, wie einfach ein Verbindungsaufbau ist.
Mir ist dabei vor allem wichtig, dass die Verbindung verschlüsselt ist. Das sollte heute eigentlich Standard sein, dennoch sieht man in vielen Tutorials immer nur die Verwendung des Port 389 auf „localhost“ ohne SSL oder StartTLS.

SSL-Zertifikat installieren
Sofern man gültige Zertifikate besitzt, muss man keine Zertifikate installieren. Wenn man allerdings selbstsignierte Zertifikate benutzt, dann muss man diese dem Programm bekanntmachen.
Da ich hier einen eigenen Zertifizierungsserver habe, möchte ich die CA-Zertifikate für alle Java-Programme installieren.

Installierte Zertifikate ausgeben lassen: (das Passwort ist „changeit“)

cd //lib/security/
keytool -list -keystore cacerts

Zertifikat installieren:

keytool -keystore cacerts -importcert -alias meinca -file meinca.pem

Programmier-Schnipsel
Library ist zu finden unter http://directory.apache.org/api !
Oder man verwendet Maven:

<dependency>
<groupid>org.apache.directory.api</groupid>
<artifactid>api-all</artifactid>
<version>${api-version}</version>
</dependency>

Für eine Verbindung sind dann nur wenige Zeilen notwendig.
Man beachte den Port 636 und den dritten Parameter „true“, damit SSL benutzt wird.
Sehr einfach:

LdapConnection connection =
new LdapNetworkConnection("mein.ldap.example.net", 636, true);
connection.bind("uid=test,ou=users,dc=example,dc=net", "passwort1");

// Hier verwenden

connection.close();

Da die Klasse LdapConnection das AutoClosable-Interface implementiert, würde ich folgende Variante empfehlen:

try(LdapConnection connection = new LdapNetworkConnection("mein.ldap.example.net", 636, true)) {
connection.bind("uid=test,ou=users,dc=example,dc=net", "passwort1");

// Hier verwenden
}
catch(Exception e) {
// Exceptions behandeln, wenn Verbindung fehlgeschlagen oder bind fehlgeschlagen.
}
// Schließen und unbinden nicht nötig!

Die Library ist auch in der weiteren Nutzung sehr einfach und intuitiv.