Après avoir attendu MacOS X Server v10.4 qui offre une interface un petit peu plus complète pour des attributs du carnet d'adresses (Address Book Attributes), j'ai décidé de mettre plutôt cela en oeuvre sur MacOS X (version cliente) afin de séparer l'annuaire LDAP destiné au carnet d'adresse de l'annaire LDAP d'identification.
Le but de l'opération consiste à créer un annuaire LDAP qui va servir à compléter les adresses électroniques lors de la rédaction des mails et qui va aussi compléter les adresses et numéros de téléphone dans l'application Carnet d'adresses.
LDAP (Lightweight Directory Access Protocol) est un protocole d'accès à un annuaire, dérivé d' X500, au dessus de TCP/IP. C'est une implémentation allégée du protocole ISO DAP. Le port TCP 389 est utilisé en standard par LDAP, démon slapd (Stand-alone LDAP Daemon).
Les bases de données LDAP sont référencées par leur DN (Distinguished Name) en général basé sur le nom de la machine dans le DNS. Au premier niveau se trouvent les DC (Domain Components), ensuite se trouvent les OU (organizational units) et les CN (common name).
La première solution sera de mettre en place l'annuaire LDAP sur sa propre machine (localhost). Il faudra ensuite, pour une utilisation réelle, y accéder en SSL et protéger la lecture par un mot de passe.
Dans la configuration mise en place, j'ai un serveur d'authentification principal MacOS X Server 10.6 (Maître Open Directory) et un serveur secondaire MacOS X Serveur 10.6 connecté au premier serveur pour le serveur de carnets d'adresses (Address Book).
Et c'est là que commencent les problèmes car il faut que la connexion SSL se fasse sans erreur. En particulier, si vous avez un certificat d'une autorité de certification non reconnue par défaut dans le système.
Il ne se passe rien et cela part en time out en tentant une connexion non sécurisée.
Si vous choisissez de ne pas cocher Encrypt using SSL, cela semble marcher et vous pouvez cocher après la case SSL sur la fenêtre de dialogue précédente.
Malheureusement, lorsque vous allez tenter de configurer un autre service, cela ne fonctionnera pas. Par exemple, vous allez obtenir les erreurs suivantes :
Le problème de fond est que la connexion SSL ne se fait pas correctement car le certificat paraît auto-signé. On a confirmation de cela avec la commande :
ldapsearch -LLL -d 4 -H ldaps://ip_authentification_server:636 -b "dc=lip6,dc=fr" "uid=one_user_login" ldap_build_search_req ATTRS: supportedSASLMechanisms TLS certificate verification: Error, self signed certificate in certificate chain
La note technique d'Apple Mac OS X Server v10.5, 10.6: Enabling SSL for Open Directory binding est une bonne piste mais elle n'est pas suffisante.
Au lieu d'ajouter la ligne TLS_CACERT, il faut indiquer un répertoire contenant tous les certificats de la chaîne de certification : TLS_CACERTDIR /private/etc/openldap/ldapssl/
Je crée donc le répertoire /etc/openldap/ldapssl/ et j'y mets
-rw-r--r-- 1 root wheel 1521 22 jan 2010 3c58f906.0 -rw-r--r-- 1 root wheel 1655 22 jan 2010 9df51c42.0 -rw-r--r-- 1 root wheel 1529 22 jan 2010 ff783690.0
Voir ici comment créer les fichiers et à quoi ils correspondent.
Il faut relancer ldap sur la machine (le plus facile est de redémarrer le serveur)
Dans le répertoire /Library/AddressBookServer/, sont créés des répertoire au nom et groupe _carddav. Un répertoire Data ne contenant rien, un répertoire Documents contenant un fichier .server-uuid (contenu : 5C807CE3-A717-4C34-B1E4-842CB7A9C0C6) et un répertoire directory vide.
Si on met une photo, le fichier .vcf contient un PHOTO;BASE64: qui, une fois décodée donne un JPEG image data, JFIF standard 1.01.
Il est aussi possible de mettre une photo la rubrique jpegPhoto du serveur LDAP. Voici un exemple de code php qui permet de le faire à partir d'une photo stockée en png sur un serveur web.
$newinfo=array(); $jpeg_filename="http://www.xxx.fr/photos/128x128/nom_photo.png"; if ($sData=file_get_contents($jpeg_filename)) $newinfo["jpegPhoto"][0]=$sData; if (count($newinfo) != 0) { $result=ldap_modify($link_identifier, $valid_dn , $newinfo); if ($result==false) { echo "Erreur (ldap_modify) : " . ldap_error($link_identifier); echo "\n