Ну, какое забавное путешествие я прошел с этим.
Проблема, с которой вы столкнулись, заключается в том, что ваш компьютер не принимает сертификат сервера как действительный. Простой способ обойти это - отключить проверку, которая выполняется в файле ldap.conf или с помощью переменной среды.
Вы можете отредактировать файл в /etc/openldap/ldap.conf
(c:\openldap\sysconf\ldap.conf
в Windows) или создать его, если он еще не существует, и вставить в него следующую строку:
TLS_REQCERT never
... или вы можете создать переменную среды с именем LDAPTLS_REQCERT
со значением never
.
Как только я сделал одну из этих вещей, у меня сработал следующий сценарий:
<?php
// Settings
$host = 'server.domain.local';
$port = 389;
$user = 'administrator';
$pass = 'password';
// Connect, set options and bind
$ds = ldap_connect($host, $port);
if (!ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3)) exit('Could not disable referrals');
if (!ldap_set_option($ds, LDAP_OPT_REFERRALS, 0)) exit('Could not disable referrals');
if (!ldap_start_tls($ds)) exit('Could not start TLS');
if (!ldap_bind($ds, $user, $pass)) exit('Bind operation failed');
// A quick list operation to make sure it worked
if (!$result = ldap_list($ds, 'dc=domain,dc=local', 'objectClass=*')) exit('List operation failed');
print_r(ldap_get_entries($ds, $result));
Досадно, что ни putenv('LDAPTLS_REQCERT=never');
, ни $_ENV['LDAPTLS_REQCERT'] = 'never';
не будут работать - вы должны либо создать файл конфигурации, либо статически установить переменную.
Если вы хотите проверить сертификаты, вам нужно будет дополнительно прочитать о том, как правильно настроить OpenLDAP.
Источники для этого: