Des problèmes avec la liaison sécurisée à Active Directory à l'aide de PHP
Il me semble être incapable d'utiliser le php afin de sécuriser la liaison à Active Directory. Les connexions non chiffrées, beau travail. L'utilisation d'autres clients sont en mesure de sécuriser la liaison, par exemple, la connexion à l'aide LDAPAdmin sur SSL. Quel est le problème ici? Est-il un LDAP SSL module que je suis absent? Comment sécuriser la liaison au serveur à l'aide de php?
Que j'ai remarqué de phpinfo()
qui s'enroulent en charge ldap/ldaps - ce qui est un bon exemple de l'utilisation de ce pour effectuer la liaison sécurisée en php? Est-ce une solution viable?
phpinfo();
ldap
LDAP Support enabled
RCS Version $Id: ldap.c 293036 2010-01-03 09:23:27Z sebastian $
Total Links 0/unlimited
API Version 3001
Vendor Name OpenLDAP
Vendor Version 20421
SASL Support Enabled
De tenter de se lier à un serveur Active Directory à l'aide de la Version de PHP 5.3.2-1ubuntu4.7 à partir de Ubuntu 10.04 repo
$username = 'user';
$password = 'passwd';
$account_suffix = '@example.com';
$hostnameSSL = 'ldaps://ldap.example.com:636';
$hostnameTLS = 'ldap.example.com';
$portTLS = 389;
ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);
//Attempting fix from http://www.php.net/manual/en/ref.ldap.php#77553
putenv('LDAPTLS_REQCERT=never');
####################
# SSL bind attempt #
####################
//Attempting syntax from http://www.php.net/manual/en/function.ldap-bind.php#101445
$con = ldap_connect($hostnameSSL);
if (!is_resource($con)) trigger_error("Unable to connect to $hostnameSSL",E_USER_WARNING);
//Options from http://www.php.net/manual/en/ref.ldap.php#73191
if (!ldap_set_option($con, LDAP_OPT_PROTOCOL_VERSION, 3))
{
trigger_error("Failed to set LDAP Protocol version to 3, TLS not supported",E_USER_WARNING);
}
ldap_set_option($con, LDAP_OPT_REFERRALS, 0);
if (ldap_bind($con,$username . $account_suffix, $password)) die('All went well using SSL');
ldap_close($con);
####################
# TLS bind attempt #
####################
$con = ldap_connect($hostnameTLS,$portTLS);
ldap_set_option($con, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($con, LDAP_OPT_REFERRALS, 0);
$encrypted = (ldap_start_tls($con));
if ($encrypted) ldap_bind($con,$username . $account_suffix, $password); //Unecrypted works, but don't want logins sent in cleartext
ldap_close($con);
#####################
# SASL bind attempt #
#####################
$con = ldap_connect($hostnameTLS,$portTLS);
ldap_set_option($con, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($con, LDAP_OPT_REFERRALS, 0);
ldap_sasl_bind($con, NULL, $password, 'DIGEST-MD5', NULL, $username. $account_suffix);
ldap_close($con);
Tous les ci-dessus échoue. Les erreurs du journal:
ldap_create
ldap_url_parse_ext(ldaps://ldap.example.com:636)
ldap_bind_s
ldap_simple_bind_s
ldap_sasl_bind_s
ldap_sasl_bind
ldap_send_initial_request
ldap_new_connection 1 1 0
ldap_int_open_connection
ldap_connect_to_host: TCP ldap.example.com:636
ldap_new_socket: 27
ldap_prepare_socket: 27
ldap_connect_to_host: Trying 1.1.1.1:636
ldap_pvt_connect: fd: 27 tm: -1 async: 0
ldap_open_defconn: successful
ldap_send_server_request
ldap_result ld 0x215380c0 msgid 1
wait4msg ld 0x215380c0 msgid 1 (infinite timeout)
wait4msg continue ld 0x215380c0 msgid 1 all 1
** ld 0x215380c0 Connections:
* host: ldap.example.com port: 636 (default)
refcnt: 2 status: Connected
last used: Thu Mar 10 11:15:53 2011
** ld 0x215380c0 Outstanding Requests:
* msgid 1, origid 1, status InProgress
outstanding referrals 0, parent count 0
ld 0x215380c0 request count 1 (abandoned 0)
** ld 0x215380c0 Response Queue:
Empty
ld 0x215380c0 response count 0
ldap_chkResponseList ld 0x215380c0 msgid 1 all 1
ldap_chkResponseList returns ld 0x215380c0 NULL
ldap_int_select
read1msg: ld 0x215380c0 msgid 1 all 1
ldap_err2string
[Thu Mar 10 11:15:53 2011] [error] [client ::1] PHP Warning: ldap_bind() [<a href='function.ldap-bind'>function.ldap-bind</a>]: Unable to bind to server: Can't contact LDAP server in /..test.php on line 28
[Thu Mar 10 11:15:53 2011] [error] [client ::1] PHP Stack trace:
[Thu Mar 10 11:15:53 2011] [error] [client ::1] PHP 1. {main}() /..test.php:0
[Thu Mar 10 11:15:53 2011] [error] [client ::1] PHP 2. ldap_bind() /..test.php:28
ldap_free_request (origid 1, msgid 1)
ldap_free_connection 1 1
ldap_free_connection: actually freed
ldap_create
ldap_err2string
[Thu Mar 10 11:15:53 2011] [error] [client ::1] PHP Warning: ldap_start_tls() [<a href='function.ldap-start-tls'>function.ldap-start-tls</a>]: Unable to start TLS: Not Supported in /..test.php on line 37
[Thu Mar 10 11:15:53 2011] [error] [client ::1] PHP Stack trace:
[Thu Mar 10 11:15:53 2011] [error] [client ::1] PHP 1. {main}() /..test.php:0
[Thu Mar 10 11:15:53 2011] [error] [client ::1] PHP 2. ldap_start_tls() /..test.php:37
ldap_create
ldap_sasl_interactive_bind_s: user selected: DIGEST-MD5
ldap_err2string
[Thu Mar 10 11:15:53 2011] [error] [client ::1] PHP Warning: ldap_sasl_bind() [<a href='function.ldap-sasl-bind'>function.ldap-sasl-bind</a>]: Unable to bind to server: Not Supported in /..test.php on line 47
[Thu Mar 10 11:15:53 2011] [error] [client ::1] PHP Stack trace:
[Thu Mar 10 11:15:53 2011] [error] [client ::1] PHP 1. {main}() /..test.php:0
[Thu Mar 10 11:15:53 2011] [error] [client ::1] PHP 2. ldap_sasl_bind() /..test.php:47
Regardant ssl réponse:
>> openssl s_client -connect my.example.com:636 -prexit
(...)
SSL handshake has read 5732 bytes and written 443 bytes
---
New, TLSv1/SSLv3, Cipher is RC4-MD5
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1
Cipher : RC4-MD5
Session-ID: 111111111111111111111111
Session-ID-ctx:
Master-Key: AAAAAAAAAAAAAAAAAAAAA
Key-Arg : None
Start Time: 1299071105
Timeout : 300 (sec)
Verify return code: 20 (unable to get local issuer certificate)
Résultats de "strace php test.php' :
write(2, " refcnt: 2 status: Connected\n", 31 refcnt: 2 status: Connected
) = 31
write(2, " last used: Tue Mar 15 10:59:19"..., 39 last used: Tue Mar 15 10:59:19 2011
) = 39
write(2, "\n", 1
) = 1
write(2, "** ld 0x954e0b8 Outstanding Requ"..., 38** ld 0x954e0b8 Outstanding Requests:
) = 38
write(2, " * msgid 1, origid 1, status In"..., 41 * msgid 1, origid 1, status InProgress
) = 41
write(2, " outstanding referrals 0, pare"..., 43 outstanding referrals 0, parent count 0
) = 43
write(2, " ld 0x954e0b8 request count 1 ("..., 45 ld 0x954e0b8 request count 1 (abandoned 0)
) = 45
write(2, "** ld 0x954e0b8 Response Queue:\n", 32** ld 0x954e0b8 Response Queue:
) = 32
write(2, " Empty\n", 9 Empty
) = 9
write(2, " ld 0x954e0b8 response count 0\n", 32 ld 0x954e0b8 response count 0
) = 32
write(2, "ldap_chkResponseList ld 0x954e0b"..., 48ldap_chkResponseList ld 0x954e0b8 msgid 1 all 1
) = 48
write(2, "ldap_chkResponseList returns ld "..., 47ldap_chkResponseList returns ld 0x954e0b8 NULL
) = 47
write(2, "ldap_int_select\n", 16ldap_int_select
) = 16
poll([{fd=3, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, -1) = 1 ([{fd=3, revents=POLLIN}])
write(2, "read1msg: ld 0x954e0b8 msgid 1 a"..., 37read1msg: ld 0x954e0b8 msgid 1 all 1
) = 37
read(3, "", 8) = 0
write(2, "ldap_err2string\n", 16ldap_err2string
) = 16
write(2, "PHP Warning: ldap_bind(): Unabl"..., 158PHP Warning: ldap_bind(): Unable to bind to server: Can't contact LDAP server in
Et j'ai le /etc/ldap.conf fixer avec 'TLS_REQCERT jamais" - même si cette correction est une autre erreur, ce qui donne une assez clair message d'erreur.
Il permet à certains, parce que j'ai essayé de l'exécuter sur une machine différente, contre le même serveur ldap, et SSL lier travaillé. C'était une centos 5 serveur avec php 5.2. La sortie de débogage aussi un peu de TLS lignes, qui sont manquants à l'installation de ubuntu. Ce que l'erreur sur ubuntu qui est, encore m'échappe
J'ai essayé de faire la mise à niveau vers 10.10, livré avec la Version de PHP => 5.3.3-1ubuntu9.3 - j'ai toujours l'excact même résultat que ci-dessus.
Votre question a été la plus utile manuel sur l'ensemble de l'internet! Vous avez fait ma journée. Une chose pourrait être modifié. putenv('LDAPTLS_REQCERT= "jamais"); a eu aucun effet du tout sur sasl sur ma machine windows.
OriginalL'auteur Jon Skarpeteig | 2011-03-10
Vous devez vous connecter pour publier un commentaire.
Avez-vous voir le commentaire sur l'PHP.net page d'aide sur les autorisations manquantes sur certains cert magasin qui fait cela:
http://de3.php.net/manual/en/function.ldap-connect.php
Alors peut-être que c'est votre problème. Si non, vous devriez lui donner strace ou wireshark essayer d'attraper les appels et les transmissions du réseau et de comprendre ce qui va pas. L'un des deux va le montrer clairement.
OriginalL'auteur schlenk
c'est comment je le fais:
avez-vous activer le certificat? je sais qu'il y a un problème, lorsque le certificat obtient refusé. éditer le fichier "/etc/ldap/ldap.conf" et ajouter "TLS_REQCERT jamais"
cependant, pour moi, il fonctionne avec ldap et ldaps:
OriginalL'auteur JMW
J'ai enfin réussi à obtenir des choses de travail sur ma machine Windows en lisant le script PHP ci-bug thread:
http://bugs.php.net/bug.php?id=48866
Malheureusement, ce n'est spécifique de Windows mais il m'a eu au moins va dans le bon sens maintenant dans mes tests (je sais, il doit travailler à partir de PHP maintenant sur mon serveur web...tellement longtemps que je l'ai ldap.conf correctement configuré). Sur Windows avec PHP 5.3, j'ai besoin d'ajouter le ldap.conf fichier dans la racine de mon disque C: (d'autres exemples que j'avais vu en ligne a été de le placer dans C:\openldap\sysconf qui ne fonctionnait pas).
TLS ne fonctionne toujours pas exactement (il me donne un "impossible de démarrer tls: impossible de contacter le serveur LDAP" message), mais le protocole SSL ne semblent être au travail et j'ai été en mesure de mettre à jour un mot de passe pour un compte dans mon script de test.
Je devine le ldap.fichier conf a juste besoin d'être configuré de la même façon sur mon serveur web et je devrait être dans les entreprises (je ne sais pas si celui qui est déjà là est celui que j'ai besoin de modifier ou si j'ai besoin de créer un autre). Je vais voir si je peux faire un rapport sur ce front.
Sur Windows, vous devez également être en mesure de le faire: putenv('LDAPTLS_REQCERT= "jamais"); au lieu de le ldap.conf correctif. J'ai aussi été en mesure de le faire fonctionner sur CentOS, alors je soupçonne un bug dans apache/ldap/php pour Ubuntu quelque part..
OriginalL'auteur Omar Ramos
Que mon code fonctionne bien avec CentOS, j'en conclus que le problème n'est pas de programmation spécifique. Je n'ai pas été en mesure d'obtenir en cours d'exécution dans mon Ubuntu environnement encore, mais je suppose que c'est un bug de mon logiciel de serveur.
OriginalL'auteur Jon Skarpeteig
Votre Active Directory ont LDAPS activé? Si oui, obtenir la Confiance de la Racine de la clé de l'AC dans la racine de confiance de magasin de clés.
OriginalL'auteur geoffc