Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1430 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Logiciels

  [Résolu] [LDAPS-PHP-Certificats] Connexion sécurisée ldaps en php

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu] [LDAPS-PHP-Certificats] Connexion sécurisée ldaps en php

n°986147
neyro
Posté le 30-11-2007 à 15:01:35  profilanswer
 

Bonjour
 
J'essaye depuis quelques jours de faire dialoguer mon apache-ssl qui héberge une application avec un openldap.
Nous avons finalement réussi à résoudre le problème.
Voilà quelques infos pour ceux qui veulent mettre en place un système d'authentification forte entre un site web et un annuaire openldap.
 
--------Config--------
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.
 
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:

Code :
  1. #Certificat de l'AC
  2. TLSCACertificateFile /etc/ldap/ssl/cert_CA.cert
  3. #Certificat du serveur ldap
  4. TLSCertificateFile /etc/ldap/ssl/cert_mon_ldap.cert
  5. #Clé privée du serveur ldap
  6. TLSCertificateKeyFile /etc/ldap/ssl/cert_mon_ldap.key
  7. #Demande d'un certificat client valide
  8. TLSVerifyClient demand


 
 
Côté serveur apache-ssl, mon site a le code suivant (volontairement simplifié pour seulement tester la connexion):
 

Code :
  1. $host="ldaps://monserveur.mondomaine.com";
  2. $port="636";
  3. $ds=ldap_connect($host,$port);
  4. ldap_set_option($ds,LDAP_OPT_PROTOCOL_VERSION,3);
  5. $r=@ldap_bind($ds,"cn=admin,o=organisation,c=fr","password" );
  6. $sr=ldap_search($ds,"o=organisation,c=fr",("objectClass=organizationalUnit" ));
  7. $info=ldap_get_entries($ds,$sr);
  8. print $info["count"]." enregistrements trouvés.";


 
 
Le fichier /etc/ldap/ldap.conf du serveur apache (considéré comme client) contient les informations suivantes:

Code :
  1. TLS_REQCERT demand
  2. TLS_CACERT /etc/ssl/cert/cert_CA.cert


 
Enfin, le fichier .ldaprc doit être créé (s'il n'existe pas) dans le hoe directory du user apache et il doit contenir:

Code :
  1. TLS_CERT /etc/ssl/cert/cert_mon_apachessl.cert
  2. 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 sur le port 636, ça ne fonctionne plus.
 
Côté ldap dans les logs, j'ai alors le message "TLS accept error error=-1".
 
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.
 
En fait je ne sais pas si php va bien lire dans le fichier /etc/ldap/ldap.conf.
 
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
 
Voici mes questions:
 
1) comment savoir si php va bien lire dans le fichier /etc/ldap/ldap.conf ?
 
2) 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 :)
 
 
------------------Solutions-------------------
 
Il y avait en fait 2 problèmes:
 
1) Le certificat généré pour le serveur apache ne contenait pas l'extension "Web client authentication" mais seulement "Web server Authentication".
J'ai généré un nouveau certificat avec les 2 extensions.
 
2) Il manquait le positionnement de la variable d'environnement $HOME au chargement d'apache.
L'initialisation de cette variable permet à php d'aller chercher le fichier .ldaprc, de récupérer le certificat indiqué dans le fichier et de le présenter au ldap.
La solution que j'ai trouvé pour initialiser cette variable (mais il y en a sûrement d'autres), c'est de modifier la ligne suivante dans le script de démarrage apache:
 

Code :
  1. ENV="env -i LANG=C PATH=/bin:/usr/bin/usr/local/bin HOME=/<home_dir_user_apache>"


 
Note: - pour que le chargement de la nouvelle variable soit pris en compte, il faut faire un stop/start de apache et non un restart.
        - il est important côté client et serveur de choisir la demande d'un certificat valide (TLSVerifyClient demand) sans quoi l'authentification n'a plus lieu d'être. On trouve beaucoup de commentaire sur le web de personnes qui résolvent le problème en mettant ce paramètre à "never". Dans ce cas, le serveur ne vérifie pas le certificat client et autorise toujours la connexion ce qui dans le cas présent est totalement contraire à ce que l'on veut faire.
 


Message édité par neyro le 20-12-2007 à 15:41:47
mood
Publicité
Posté le 30-11-2007 à 15:01:35  profilanswer
 

n°986389
neyro
Posté le 01-12-2007 à 12:29:09  profilanswer
 

Mise à jour du poste avec plus d'informations.
 
[:yoyoz]

n°986655
neyro
Posté le 02-12-2007 à 18:58:15  profilanswer
 

:bounce:

n°986669
e_esprit
Posté le 02-12-2007 à 19:36:31  profilanswer
 

1) essaye de lancer ton script en ligne de commande, avec strace.
Tu verras si il lit (ou essaye de lire) ton fichier de conf ou pas.


---------------
Ce n'est point ma façon de penser qui a fait mon malheur, c'est celle des autres.
n°986671
neyro
Posté le 02-12-2007 à 19:42:04  profilanswer
 

Quel script lancer?  
strace attend des exécutable.
J'ai essayé un strace avec /etc/init.d/apache-ssl mais ça donne pas grand chose. :(

n°986672
e_esprit
Posté le 02-12-2007 à 19:43:26  profilanswer
 

strace php ton_script.php


---------------
Ce n'est point ma façon de penser qui a fait mon malheur, c'est celle des autres.
n°986707
neyro
Posté le 02-12-2007 à 21:04:24  profilanswer
 

OK, je vais essayer ça demain.
Je te tiens au courant.

n°986850
neyro
Posté le 03-12-2007 à 11:16:49  profilanswer
 

Si j'exécute /usr/bin/strace php monscript.php, j'ai droit à "Command not found"!
 
Par contre j'ai trouvé un gars qui présentait sa méthode pour activer le SSL entre ldap/apache mais j'arrive pas bien à comprendre ce passage. Si quelqu'un a une idée...
 

Code :
  1. Now, let's run Apache. I've built DSO Apache with it's mod_ssl and
  2. mod_php4. I've made PHP4 `ldap' shared extension. I can only load this
  3. extension within php.ini or dl(), not Apache php_value. It seems to be
  4. broken.
  5. This way I propagate my LDAP TLS settings to ldap-php-enabled Apache:
  6. LDAPTLS_CACERT=$HOME/etc/MY-CA-CERT \
  7. LDAPTLS_CERT=$HOME/etc/client.crt \
  8. LDAPTLS_KEY=$HOME/etc/client.key \
  9. LDAPTLS_REQCERT=hard \
  10. PHPRC=$HOME/etc \
  11. /opt/apaches/DSO/bin/httpd -d "$HOME"
  12. I want my PHP to have it's own custom php.ini, not system-wide
  13. (PHPRC).


 
Source ICI

Message cité 1 fois
Message édité par neyro le 03-12-2007 à 11:17:25
n°986913
neyro
Posté le 03-12-2007 à 13:56:53  profilanswer
 

Quelques nouvelles de l'avancée du problème:
 
Pour vérifier le bon paramétrage du fichier /etc/ldap/ldap.conf et .ldaprc, j'ai utilisé l'utilitaire ldapsearch.
 
J'ai donc lancé la commande:
 

Code :
  1. ldapsearch -x -H "ldaps://monserveur.mondomaine.com:636" -D "cn=admin,o=organisation,c=fr" -W


 
L'erreur rencontrée a été "sslv3 alert unsupported certificate".
En fait il faut bien à la création du certificat, choisir les extensions "Web server authentication" et surtout "Web client authentication".
J'ai regénéré un certificat en ajoutant l'option "Web client authentication" et là ça a bien fonctionné.
 
Maintenant, pour être sûr que l'utilitaire ldapsearch utilisait bien le fichier ldap.conf et .ldap.rc, j'ai modifié le chemin vers le certificat client dans le fichier .ldaprc.
L'authentification n'a pas fonctionné et sur le serveur ldap  j'avais le même message d'erreur que lors de la connexion avec le script php (TLS accept error).
 
Par conséquent, le paramétrage sur mon client semble bon.
Je pense que php ne lit pas le fichier ldap.conf.
 
La question est "pourquoi?".
 
Si quelqu'un a une idée :??:
 
Je n'arrive pas à lancer strace avec un script php...


Message édité par neyro le 03-12-2007 à 13:57:45
n°986932
e_esprit
Posté le 03-12-2007 à 14:38:41  profilanswer
 

neyro a écrit :

Si j'exécute /usr/bin/strace php monscript.php, j'ai droit à "Command not found"!


Ben faut installer strace :D

neyro a écrit :


Par contre j'ai trouvé un gars qui présentait sa méthode pour activer le SSL entre ldap/apache mais j'arrive pas bien à comprendre ce passage. Si quelqu'un a une idée...
 

Code :
  1. Now, let's run Apache. I've built DSO Apache with it's mod_ssl and
  2. mod_php4. I've made PHP4 `ldap' shared extension. I can only load this
  3. extension within php.ini or dl(), not Apache php_value. It seems to be
  4. broken.
  5. This way I propagate my LDAP TLS settings to ldap-php-enabled Apache:
  6. LDAPTLS_CACERT=$HOME/etc/MY-CA-CERT \
  7. LDAPTLS_CERT=$HOME/etc/client.crt \
  8. LDAPTLS_KEY=$HOME/etc/client.key \
  9. LDAPTLS_REQCERT=hard \
  10. PHPRC=$HOME/etc \
  11. /opt/apaches/DSO/bin/httpd -d "$HOME"
  12. I want my PHP to have it's own custom php.ini, not system-wide
  13. (PHPRC).


 
Source ICI


Il déclare les variables avant que le process apache soit lancé, donc celui-ci les connait, et php les hérite, donc il n'a plus le problème
de savoit si php charge bien le fichier /etc/ldap/ldap.conf
 
Enfin c'est ce que je pense qu'il cherche à faire, je ne peux dire si cela fonctionne ou pas.


---------------
Ce n'est point ma façon de penser qui a fait mon malheur, c'est celle des autres.
mood
Publicité
Posté le 03-12-2007 à 14:38:41  profilanswer
 

n°986938
neyro
Posté le 03-12-2007 à 14:53:24  profilanswer
 

e_esprit a écrit :


Ben faut installer strace :D


 
C'est installé bien sûr  ;)  
Mais quand je le lance, ça me met cette erreur.
 
Par contre si je lance avec /etc/init.d/apache-ssl ça fonctionne bien.
Mais je n'ai pas de trace de ldap.conf.

n°986996
e_esprit
Posté le 03-12-2007 à 16:05:22  profilanswer
 

Mets le path complet pour php peut-être ?


---------------
Ce n'est point ma façon de penser qui a fait mon malheur, c'est celle des autres.
n°987048
neyro
Posté le 03-12-2007 à 16:48:11  profilanswer
 

J'ai essayé. Il le prend bien mais il met qu'il n'a pas les droits d'exécution.
En fait strace attend un exécutable :/

n°987068
e_esprit
Posté le 03-12-2007 à 17:10:42  profilanswer
 

/usr/bin/php4 :o


---------------
Ce n'est point ma façon de penser qui a fait mon malheur, c'est celle des autres.
n°987435
neyro
Posté le 04-12-2007 à 14:25:39  profilanswer
 

Avancée du problème:
 
J'ai installé le package php4-cli qui est un interpréteur de php.
L'avantage est qu'il permet d'exéctuer du code php sans passer par Apache.
 
J'exécute donc mon script avec la commande:

Code :
  1. #/usr/sbin/php monscript.php


 
Et là magie...ça fonctionne. Et l'interpréteur lit bien les fichiers ldap.conf et .ldaprc.
 
C'est donc lorsque je passe par le navigateur et donc par apache qu'il y a un problème.
 
Je vais regarder du côté des variables d'environnement et après des librairies...
 
Si jamais certains ont des idées, n'hésitez pas.


Message édité par neyro le 04-12-2007 à 14:27:59
n°987486
neyro
Posté le 04-12-2007 à 15:28:09  profilanswer
 

Trouvé! C'est dû à une variable d'environnement non positionnée  :(  
 
En fait, le fichier qui indique l'emplacement du certificat de l'utilisateur doit se trouver dans le home directory du user apache. Mais surtout il faut que apache charge la variable d'environnement $HOME afin que php puisse aller rechercher ce fichier .ldaprc.
 
Dans mon cas, le script de démarrage apache positionnait seulement les variables LANG et PATH.
Lorsque je lançais mon script, php n'arrivait pas à trouver de fichier .ldaprc.
Lorsqu'il se connectait au ldap, il ne présentait pas de certificat et la connexion était interrompue.
 
J'ai donc modifié la ligne suivante dans /etc/init.d/apache:
 

Code :
  1. ENV="env -i LANG=C PATH=/bin:/usr/bin/usr/local/bin HOME=/<home_dir_apache>"


 
Et du coup ça fonctionne bien.
 
Je vais mettre à jour mes paramétrages dans le 1er post afin d'aider les gens qui comme moi galèrent à mettre ce type d'authentifcation en place.
 
A+
 
Note: pour que le chargement de la nouvelle variable soit pris en compte, il faut faire un stop/start de apache et non un restart.


Message édité par neyro le 04-12-2007 à 15:44:37

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Logiciels

  [Résolu] [LDAPS-PHP-Certificats] Connexion sécurisée ldaps en php

 

Sujets relatifs
[Samba] Permissions qui ne fonctionnent pas [Résolu]Impossible de configurer ma connexion...[RESOLU]
ZendOptimizer FreeBSD vps v2 pro via verioUbuntu: Carte wifi BCM 43xx reconue mais connexion impossible
[Résolu] WoL Debian fonctionne dans certains casErreur de compilation driver nvidia (résolu)
[Resolu]Arret du disque dur répété sur hp 8510pScript Connexion Samba
[resolu] [debian etch] serveur ntp 
Plus de sujets relatifs à : [Résolu] [LDAPS-PHP-Certificats] Connexion sécurisée ldaps en php


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR