PHP не может подключиться к LDAP Oracle Directory Server Enterprise Edition


Играл с этим в течение нескольких дней и не может заставить php привязываться к ldap в DSEE Oracle.

function test(){


    // LDAP variables
    $ldaphost = "xxx.xxxxx.com";        
    $ldapport = 636;
    $ldaprdn  = 'cn=xyxyxyxy,ou=Accounts,dc=xxx,dc=xxxxx,dc=com';
    $ldappass = 'vcvcvcvcvc';

    ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7); // isn't helping

    // Connecting to LDAP
    $ldapconn = ldap_connect($ldaphost, $ldapport)
              or die("Could not connect to $ldaphost");

    if ($ldapconn) {

        // binding to ldap server
        $ldapbind = ldap_bind($ldapconn, $ldaprdn, $ldappass);

        // verify binding
        if ($ldapbind) {
            echo "LDAP bind successful...";
        } else {
            echo "LDAP bind failed...";
        }

    }
}

Я получаю ошибку:

Сообщение: ldap_bind() [функция.ldap-привязка]: Не удается выполнить привязку к серверу: Не удается связаться с сервером LDAP

Рву на себе волосы из-за этого. Я просто не могу заставить эту штуку привязаться.

Попробовали прямой telnet к хосту на порту 636 и не блокируются никаким брандмауэром. Странно, что я не получаю никакой дополнительной отладочной информации от "LDAP_OPT_DEBUG_LEVEL" на экране или в моих журналах.

Author: phirschybar, 2011-05-04

4 answers

start_tls() и ldaps является взаимоисключающим, что означает, что вы не можете выдавать start_tls() на порту ssl (стандарт 636) или инициировать ldaps на незашифрованном порту (стандарт 389). Команда start_tls() инициирует безопасное соединение на незашифрованном порту после инициализации соединения, поэтому вы должны выполнить это до того, как произойдет привязка, чтобы сделать его зашифрованным. Другой набор распространенных портов - 3268 (незашифрованный) и 3269 (ssl), которые могут быть включены на вашем сервере.

ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);

Ведет журнал в журнал ошибок ваших веб-серверов, в зависимости от вашего уровня журнала, или в stout (из командной строки PHP). Чтобы получить дополнительную информацию здесь, проверьте настройки уровня журнала вашего веб-сервера или просто запустите php-скрипт из командной строки.

Для успешного использования ssl-порта вам необходимо указать префикс ldaps://, в то время как на незашифрованном порту это необязательно (с префиксом ldap://).

Глядя на ваш код, это может быть проблема с версией протокола, так как PHP по умолчанию использует версию 2. Чтобы решить эту проблему, вы может выдать:

ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION,3);
ldap_set_option($conn, LDAP_OPT_REFERRALS,0);

Прежде чем вы попытаетесь связать.

Вы также можете взглянуть на код в Проблемы с безопасной привязкой к Active Directory с использованием PHP, который я успешно использую в CentOS 5, но у меня проблемы в Ubuntu. Если на вашем сервере есть открытый незашифрованный порт, рекомендуется выполнить незашифрованную тестовую привязку к нему, чтобы исключить любые проблемы с подключением.

Чтобы проверить, открыт ли порт, вы можете проверить, подключается ли к нему telnet, Например:

telnet my.server.com 3268

Если порт открыт, то вы должны иметь возможность выполнить привязку с его помощью.

* Редактировать: Если сертификат ssl будет признан недействительным, соединение завершится ошибкой, если это так, установка уровня отладки на 7 объявит об этом. Чтобы обойти эту конкретную проблему, вам нужно игнорировать действительность:

Вы можете игнорировать действительность в Windows, выдав

putenv('LDAPTLS_REQCERT=never');

В вашем php-коде. В *nix вам нужно отредактировать файл /etc/ldap.conf, чтобы он содержал

TLS_REQCERT never
 3
Author: Jon Skarpeteig, 2017-05-23 12:17:39

Порт 636 является портом с поддержкой SSL и требует подключения с поддержкой SSL. Вы должны попытаться подключиться к порту 389 или изменить свой код, чтобы включить безопасный уровень (гораздо более сложный).

С уважением,

Людовик

 0
Author: Ludovic Poitou, 2011-05-05 10:03:29

Для подключения с использованием SSL вам следует попробовать

$ldapconn = ldap_connect('ldaps://'.$ldaphost);

Это автоматически подключится к порту 636, который является портом по умолчанию ldaps. В зависимости от установки и конфигурации вашего сервера может быть возможно, что соединения разрешены только на порту 389 (без шифрования или с использованием TLS) или только на порту 636 с использованием SSL-шифрования. Хотя вполне возможно, что ваш сервер предоставляет доступ к другим портам. Так что в целом вам нужно знать, к какому порту вы собираетесь подключиться и какое шифрование метод, который требуется серверу (без шифрования, SSL или TLS).

 0
Author: Stefan Gehrig, 2011-05-05 10:11:54

Подписан ли сертификат сервера LDAP действительным центром сертификации? Может быть, ваш клиент просто отклоняет сертификат!

 0
Author: ZoolWay, 2011-05-13 12:13:32