Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
php, python (zope,plone) und ldaptools mit tls zum ldapserver
konfiguration redhat linux
ohne Zertprüfung:
folgende option zum configfile /etc/openldap/ldap.conf hinzufügen:
TLS_REQCERT never
debug probleme bei php:
php-option für ldap, die ich vor das erste ldap-connect eingefügt habe:
ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);
in der logdatei vom webserver findet sich dann folgendes (wenn TLS_REQCERT noch nicht auf 'never' steht):
TLS trace: SSL_connect:before/connect initialization TLS trace: SSL_connect:SSLv2/v3 write client hello A TLS trace: SSL_connect:SSLv3 read server hello A TLS certificate verification: depth: 0, err: 20, subject: /C=DE/ST=Thuringia/L=Schmalkalden/O=FH Schmalkalden/OU=IuK- Zentrum/CN=postfix.fh-schmalkalden.de, issuer: /C=DE/ST=Thuringia/L=Schmalkalden/O=Fachhochschule Schmalkalden/OU=IuK-Zentrum/CN=CA2 FH Schmalkalden/emailAddress=ca@fh- schmalkalden.de TLS certificate verification: Error, unable to get local issuer certificate
Schalter Z für TLS!
Installation IUK-Wurzelzertifikat
Prüfe die folgenden Einstellungen in /etc/openldap/ldap.conf
# Legt das Verzeichnis fest, indenen nach CA Zertifikaten gesucht wird TLS_CACERTDIR /etc/openldap/cacerts # Legt fest, das ohne ein Zertifikat, oder bei falschem Zertifkat die Verbindung abgebrochen wird TLS_REQCERT hard
Das iuk2ca.crt-Zertifikat muss nach /etc/openldap/cacerts/iukca2.crt kopiert werden. Mit
openssl x509 -subject_hash -noout -in iukca2.crt
wenn -subject_hash nicht unterstützt wird dann mit
openssl x509 -hash -noout -in iukca2.crt
wird der Subject-Hash angezeigt, z.B. 3e4202dc, mit
ln -s iukca2.crt 3e4202dc.0
wird ein entsprechender Symlink angelegt.
ACHTUNG: punkt-null nicht vergessen, der symlink lautet also <hash>.0 und nicht <hash>!
Nun kann man mit
openssl s_client -connect ldap.fh-schmalkalden.de:636 -CApath /etc/openldap/cacerts
prüfen, ob eine SSL-Verbindung hergestellt werden kann. Dann kann mit
ldapsearch -Z -H ldap://ldap.fh-schmalkalden.de -b "ou=students,dc=fh-sm,dc=de" -x "(uid=...)"
eine Abfrage erfolgen (natuerlich eine sinnvolle uid einsetzen).
erfolgeich, nachdem ich das „.0“ beim hash ergänzt habe. Jenad 15:07, 25. Okt 2007 (CEST)]]
aber python:
ldap.SERVER_DOWN: {'info': 'TLS: hostname does not match CN in peer certificate', 'desc': "Can't contact LDAP server"}
d.h. wir müssen mit dem namen connecten der im zert drinsteht, also in diesem fall mit postfix.fh-schmalkalden.de
>>> a=ldap.initialize('ldaps://postfix.fh-schmalkalden.de') >>> a.search('dc=fh-sm,dc=de',2,'cn=jens*') 1
Bingo!!
quellcode php
Bei php muß der apache neu gestartet werden. Die Paramater in /etc/openldap/ldap.conf werden wohl nur einmalig beim start des apache eingelesen.
<?php # zur fehlersuche: # ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7); $ds=ldap_connect($ldaphost); # da ist so im ldap-connect, es wird immer true geliefert, auch wenn der # host nicht erreichbar ist, deshalb noch ein anonymer bind hinterher: $rr=ldap_bind($ds); # echo ldap_error($ds); # nur wenn bind oben erfolgreich (server ist erreichbar): if ($rr) { ## tls einschalten: if (!ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)) { error_log ("Failed to set LDAP Protocol version to 3, TLS not supported.",0); } if (!ldap_start_tls($ds)) { error_log ("Ldap_start_tls failed",0); } #echo ldap_error($ds); # mache irgendwas ...... # programmcode .... # bool ldap_unbind ( resource link_identifier ) if (!ldap_unbind($ds)) { echo "Verbindung zum LDAP Server konnte nicht getrennt werden"; } } else { echo "Verbindung zum LDAP Server nicht möglich"; } ?>