Не можете связать в php с Active Directory LDAP через SSL? - PullRequest
0 голосов
/ 23 января 2020

У нас есть сайт IIS php, который аутентифицируется в Active Directory с использованием LDAP, в частности, с использованием ldap_connect и ldap_bind. Это работает нормально, но мы готовимся к ожидающему изменению, чтобы разрешить только подписанную привязку LDAP к AD. Когда я обновляю свой код до того, что, по моему мнению, должно работать, я получаю ошибку аутентификации, но не могу вывести фактический код ошибки, чтобы помочь устранить неполадки.

На данный момент привязка TLS отключена в нашем домене контроллеры, я просто хочу использовать привязку AD SSL более 636 (вместо TLS более 389). Мы используем PHP 5.6.30 для IIS 6.1 на сервере Server 2008 R2 ... У нас есть цель миграции, которая представляет собой Server 2016 на IIS 10 и PHP 7.2, и мы видим тот же результат. php_openssl и php_ldap являются включенными расширениями.

Вот текущий код:

    $this->AD_SERVER = $config['AD_SERVER'];
    assert(is_string($password));
    if ($password == "") {
        throw new \SimpleSAML\Error\Error('NOPASSWORD');
    }
    $ldap = ldap_connect($this->AD_SERVER);
    $ldaprdn = 'DOMAINPREFIX' . "\\" . $user;
    ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 9);
    ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
    ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
    $bind = @ldap_bind($ldap, $ldaprdn, $password);

Это прекрасно работает. После этого извлечение атрибутов с использованием «ldap_search» и «ldap_get_entries» проходит успешно. Имя пользователя и пароль предоставляются пользователем, пытающимся пройти аутентификацию; привязка происходит под учетными данными аутентифицирующего пользователя.

Если я изменяю первую строку на следующую, я просто получаю ошибку аутентификации, больше нет описательной ошибки:

    $this->AD_SERVER = 'ldaps://'.$config['AD_SERVER'].':636';
    assert(is_string($password));
    if ($password == "") {
        throw new \SimpleSAML\Error\Error('NOPASSWORD');
    }
    $ldap = ldap_connect($this->AD_SERVER);
    $ldaprdn = 'DOMAINPREFIX' . "\\" . $user;
    ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 9);
    ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
    ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
    $bind = @ldap_bind($ldap, $ldaprdn, $password);

У меня есть перепутал с "LDAP_OPT_X_TLS_REQUIRE_CERT" и отключил другие вещи tls, но это не имеет значения (и я не думал, что это будет).

На контроллере домена, для неудачных попыток, я вообще не вижу ни одного eventID от 2280-2290 (который, я полагаю, выявит ошибки привязки). Кроме того, я вижу только 4776 (попытки аутентификации), когда настроена небезопасная привязка, и я никогда не получаю попытки вообще, когда сбой безопасной привязки. Я считаю, что есть проблема с привязкой, однако я не могу представить какие-либо журналы, чтобы помочь диагностировать ее.

Я нашел много статей, указывающих, как это сделать для openldap, но очень я почти ничего не нашел документирование AD LDAP подписанного связывания. Я видел много людей, которые указали, что мы должны перейти на TLS, поскольку привязка SSL через 636 - это нестандартная вещь LDAP, и она применима только к AD, однако мы действительно хотели бы избежать этого, если это возможно. Любая помощь будет оценена.

1 Ответ

0 голосов
/ 23 января 2020

Ответ был найден в этой записи блога: https://ashleyknowles.net/2011/07/iis-php-and-ldaps-with-active-directory/

Экспорт Root CA в формате Base64 X.509

Создать C: \ OpenLDAP \ sysconf \ дерево каталогов (не устанавливайте OpenLDAP, просто создайте папки)

Скопируйте Root сертификат CA на веб-сервер (C: \ OpenLDAP \ sysconf \ webcert.crt)

Создать C: \ OpenLDAP \ sysconf \ ldap.conf со следующими строками:

TLS_REQCERT never

TLS_CACERT c: \ openldap \ sysconf \ webcert.crt

Используйте ldap_connect («ldaps: // servername //») для подключения

...