Подключение к AD из PHP по протоколу LDAPS

от автора

Прочитав пост Создаем пользователя 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


ссылка на оригинал статьи https://habr.com/ru/articles/724008/