Bonjour
J'essaye depuis quelques jours de faire dialoguer mon apache-ssl qui héberge une application avec un openldap.
Serveur apache:
OS Debian Etch 4.0
apache-ssl v1.3
php4
Serveur ldap:
OS Debian sarge 3.1
Openldap v1.130.2.13.2.1
L'idée est la suivante:
Mon site est accessible en https. Les utilisateurs s'authentifient par certificat. Cette partie là fonctionne bien.
Parallèlement, le site accède à des données hébergées sur un autre serveur qui a openldap d'installé. L'accès à ce ldap doit se faire avec SSL/TLS via php4.
Le problème ici concerne bien le dialogue entre le code php du site et le serveur ldap.
Des certificats ont été générés et signés par une même autorité de certification pour le serveur LDAP et pour le serveur apache.
Côté ldap, le fichier slapd.conf contient ces informations:
Côté serveur apache-ssl, mon site a le code suivant (en résumé):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 #Certificat de l'AC TLSCACertificateFile /etc/ldap/ssl/cert_CA.cert #Certificat du serveur ldap TLSCertificateFile /etc/ldap/ssl/cert_mon_ldap.cert #Clé privée du serveur ldap TLSCertificateKeyFile /etc/ldap/ssl/cert_mon_ldap.key #Demande d'un certificat client valide TLSVerifyClient demand
Le fichier /etc/ldap/ldap.conf du serveur apache (considéré comme client) contient les informations suivantes:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 $host="ldaps://monserveur.mondomaine.com"; $ds=ldap_connect($host); ldap_set_option($ds,LDAP_OPT_PROTOCOL_VERSION,3); $r=@ldap_bind($ds,"cn=admin,o=organisation,c=fr","password" ); $sr=ldap_search($ds,"o=organisation,c=fr",("objectClass=organizationalUnit" )); $info=ldap_get_entries($ds,$sr); print $info["count"]." enregistrements trouvés.";
Enfin le fichier .ldaprc qui est dans le répertoire de root (qui lance apache) contient:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 TLS_REQCERT demand TLS_CACERT /etc/ssl/cert/cert_CA.cert
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 TLS_CERT /etc/ssl/cert/cert_mon_apachessl.cert TLS_KEY /etc/ssl/cert/key_mon_apachessl.key
Quand je fais des tests de connexion sur le port 389, c'est-à-dire que la connexion avec le ldap s'effectue en clair, tout fonctionne bien.
Mais si je passe en ldaps dans mon code php sur le port 636, ça ne fonctionne plus.
Côté ldap dans les logs, j'ai alors le message "TLS accept error error=-1".
Et côté apache, j'ai les erreurs:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 ldap_create ldap_url_parse_ext(ldaps://monserveur.mondomaine.com) ldap_bind_s ldap_simple_bind_s ldap_sasl_bind_s ldap_sasl_bind ldap_send_initial_request ldap_new_connection ldap_int_open_connection ldap_connect_to_host: TCP monserveur.mondomaine.com:636 ldap_new_socket: 4 ldap_prepare_socket: 4 ldap_connect_to_host: Trying <MON_IP>:636 ldap_connect_timeout: fd: 4 tm: -1 async: 0 ldap_ndelay_on: 4 ldap_is_sock_ready: 4 ldap_ndelay_off: 4 ldap_int_sasl_open: host=monserveur.mondomaine.com TLS: can't connect. ldap_err2string ldap_err2string
A noter que le cn du certificat du ldap correspond bien à l'url qui me permet de me connecter au ldap à savoir monserveur.mondomaine.com.
Par contre, si je lance la commande suivante depuis mon serveur apache, ça fonctionne bien:
Donc en clair, j'ai l'impression que php ne va pas bien lire dans le fichier /etc/ldap/ldap.conf ni dans le fichier /root/.ldaprc
Code : Sélectionner tout - Visualiser dans une fenêtre à part dapsearch -x -H "ldaps://monserveur.mondomaine.com:636" -D "cn=admin,o=organisation,c=fr" -W
J'ai fait pas mal de rercherche et voici quelques liens qui pourront en aider certains:
http://www.arnaudcharlier.be/blog/ [...] l-avec-php
http://www.openldap.org/pub/ksoper/OpenLDAP_TLS.html
http://www.openldap.org/lists/open [...] 01023.html
Est ce que quelqu'un sait comment vérifier si php va bien lire dans le fichier /etc/ldap/ldap.conf et .ldaprc?
Avez vous des idées pour faire fonctionner cette connexion entre le site php et le ldap?
La question a été posée plusieurs fois sur le net mais il n'y a pas vraiment de réponse claire qui fonctionne.
Souvent la solution de facilité est de mettre le paramètre TLSVerifyClient à never mais du coup, même si cela fonctionne, il n'y a plus de sécurité car le serveur ldap autorise toujours la connexion (pas de demande de certificat valide) sans être sûr de l'identité du serveur qui vient se connecter.
Merci d'avance![]()
Partager