Прочитав пост Создаем пользователя AD через веб-интерфейс, вспомнил, что около года назад занимался с аналогичной задачей. Проблема была в том, что не удавалось создать пользователя при соединении по протоколу LDAP, а получилось только по протоколу LDAPS. Выкладываю свои записи, вдруг кому пригодится.

Все действия проделывались в RHEL 5.5 и Windows Server 2003 R2 EE.

Сертификаты

Потребуется пакет OpenSSL
rpm -ivh openssl-0.9.8e-12.el5_4.6.i686.rpm
rpm -ivh openssl-perl-0.9.8e-12.el5_4.6.i386.rpm

Файл /etc/pki/tls/openssl.cnf
dir = /root/sslCA
default_days = 3650
countryName_default = UA
stateOrProvinceName_default = Lugansk
localityName_default = Lugansk
0.organizationName_default = CompanyName
organizationalUnitName_default  = IT
...
# в конце файла
[ sign_ias_csr ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:always
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth,serverAuth

cd /root/
mkdir sslCA
chmod 700 sslCA
cd /root/sslCA
mkdir certs private newcerts
echo 1000 > serial
touch index.txt
openssl req -new -x509 -days 3650 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -config /etc/pki/tls/openssl.cnf

Сертификаты для контроллеров домена

Файл /root/sslCA/gencert.sh
#!/bin/sh
NAME=$1
BITS=1024
CONFIG=/etc/pki/tls/openssl.cnf

# Generating the Certificate Request

# Create server key
echo ""; echo "Creating server key"; echo ""
openssl genrsa -des3 -out server${NAME}.key.pass -passout pass:1234 ${BITS} || exit

# Remove passphrase
echo ""; echo "Removing passphrase"; echo ""
openssl rsa -in server${NAME}.key.pass -out server${NAME}.key -passin pass:1234 || exit

# Generate certificate request
echo ""; echo "Generating certificate request"; echo ""
openssl req -config ${CONFIG} -new -days 3650 -key server${NAME}.key -out csr${NAME}.pem || exit

# Signing the Certificate
echo ""; echo "Signing the Certificate"; echo ""
openssl ca -config ${CONFIG} -days 3650 -extensions sign_ias_csr -out new${NAME}.pem -in csr${NAME}.pem || exit

# Generate a Public/Private key file
cp server${NAME}.key cert${NAME}.pem
openssl x509 -in new${NAME}.pem >> cert${NAME}.pem || exit

# Generate the PKCS12 file
echo ""; echo "Generating PKCS12"; echo ""
openssl pkcs12 -name "Test Cert" -export -in cert${NAME}.pem -out cert${NAME}.p12 || exit

chmod +x /root/sslCA/gencert.sh
/root/sslCA/gencert.sh 01

При запросе **Common Name (eg, your name or your server's hostname) []:** нужно обязательно ввести FQDN DC для которого создаем сертификат.
cp /root/sslCA/cacert.pem /etc/pki/tls/certs/
c_rehash
rpm -ivh openldap-clients-2.3.43-12.el5.i386.rpm

PHP должен быть с поддержкой ldap
Файл /etc/openldap/ldap.conf
# Instruct client to NOT request a server's cert.
TLS_REQCERT never

# Define location of CA Cert
TLS_CACERT /etc/pki/tls/certs/cacert.pem
TLS_CACERTDIR /etc/pki/tls/certs

cp /etc/openldap/ldap.conf /var/www/.ldaprc

Установка сертификатов на DC

1. Копируем на сервер файлы
* cert.p12 — The certificate
* cacert.pem — The Root Certificate

2 .Start, Run, MMC, File, Add/Remove Snap-in, Add, Certificates, Computer Account, Local Computer, My User Account, Next, Finish, Close, Ok

3. Разворачиваем Certificates

4. Импортируем cacert.pem в Trusted Root Certificates Authorities (правой кнопкой на Trusted Root Certificates Authorities, All Tasks, Import, Next, Browse, All files, выбираем наш cacert.pem ...)

5. Импортируем cert.p12 в Personal (правой кнопкой на Personal, All Tasks, Import, Next, Browse, All files, находим наш cert.p12, если нужно вводим пароль ...)

6. Проверяем сертифика на DC
* Разворачиваем папки Personal и Certificates
* Двойной щклчок по установленному сертификару
* Убеждаемся, что есть строка «You have a private key that corresponds to this certificate»

Проверка сзязи

Файл /var/www/html/test.php
<?php
$ldapuser = "administrator@testlab.local";
$ldappass = "superpass";
$ldapserver = "192.168.0.1";

$ad = ldap_connect("ldaps://".$ldapserver) or die("Cant connect to LDAP Server");
ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3);
$adbind = ldap_bind($ad, $ldapuser, $ldappass);
if ($adbind)
{
    echo "LDAP bind successful...";
}
else
{
    echo "LDAP bind failed...";
}
?>

www.digitalissues.co.uk/html/os/ms/ldaps.html

Комментарии (5)



  1. ilkman
    00.00.0000 00:00
    +2

    Что это? Нахера? Какой 2003?


    1. Shuriban
      00.00.0000 00:00

      Да блин, я просто инвайт чуваку выдал за полезную статью. Мне она по крайней мере пригодилась, что бы понять почему я не могу пароль пользователю на ldap сервере задать.
      Я и не думал, что при этом статья из песочницы автоматически публикуется.


  1. j-b
    00.00.0000 00:00

    Статья по ссылке уже не доступна.

    И можно ли пример, самого простого пример: добавления / редактирования / отключения / удаления пользователя в LDAP?

    У меня только авторизация хорошо работает, и то без SSL...


    1. Shuriban
      00.00.0000 00:00

      Тебе примеры на php нужны?