Изменить пароль в Active Directory с помощью LDAP / PHP / IIS / SSL

Прежде всего, это может быть меньше вопросов программирования и больше того, как мне настроить вопрос LDAPS, но здесь идет …

Справочная информация:

У меня есть два сервера Windows 2008 R2. Один из них – контроллер домена (DC) с Active Directory (AD), с которым я хочу общаться через LDAP. Это называется TestBox.TestDomain.local. На другом сервере работают IIS, PHP (с ldap и openssl) и mySQL.

Что / не работает:

Я могу успешно подключиться к DC необеспеченному порту 389 и читать / записывать данные в AD. То, что я не могу сделать, это изменить или установить пароли пользователей, поскольку для этого требуется безопасное соединение с использованием LDAPS (LDAP w / SSL) через порт 636.

Мне нужна помощь:

Я попытался установить службы сертификации Active Directory (AD CS) и настроить DC для работы в качестве центра сертификации (CA), используя информацию, найденную здесь: http://technet.microsoft.com/en-us/library/cc770357(WS. 10) .aspx, но независимо от того, что я пытаюсь, я не могу подключиться к LDAPS для работы.

Образец кода:

Создание соединения LDAP

function ldapConnect(){ $ip = "100.200.300.400"; // WAN IP goes here; $ldap_url = "ldap://$ip"; $ldaps_url = "ldaps://$ip"; $ldap_domain = 'testdomain.local'; $ldap_dn = "dc=testdomain,dc=local"; // Unsecure - WORKS $ldap_conn = ldap_connect( $ldap_url ) or die("Could not connect to LDAP server ($ldap_url)"); //alternate connection method //$ldap_conn=ldap_connect( $ip, 389 ) or die("Could not connect to LDAP server (IP: $ip, PORT: 389)"); // Secure - DOESN'T WORK //$ldap_conn = ldap_connect( $ldaps_url ) or die("Could not connect to LDAP server ($ldaps_url)"); //alternate connection method //$ldap_conn=ldap_connect( $ip, 636 ) or die("Could not connect to LDAP server (IP: $ip, PORT: 636)"); ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3); ldap_set_option($ds, LDAP_OPT_REFERRALS, 0); $username = "AdminUser"; $password = "AdminPass"; // bind using admin username and password // could also use dn... ie. CN=Administrator,CN=Users,DC=TestDomain,DC=local $result = ldap_bind($ldap_conn, "$username@$ldap_domain", $password ) or die("<br>Error: Couldn't bind to server using supplied credentials!"); if($result){ return $ldap_conn; }else{ die("<br>Error: Couldn't bind to server using supplied credentials!"); } } 

Добавление нового пользователя в Active Directory

 function ldapAddUser($ldap_conn, $ou_dn, $firstName, $lastName, $username, $pwdtxt, $email){ $dn = "CN=$firstName $lastName,".$ou_dn; ## Create Unicode password $newPassword = "\"" . $pwdtxt . "\""; $len = strlen($newPassword); $newPassw = ""; for($i=0;$i<$len;$i++) { $newPassw .= "{$newPassword{$i}}\000"; } $ldaprecord['cn'] = $firstName." ".$lastName; $ldaprecord['displayName'] = $firstName." ".$lastName; $ldaprecord['name'] = $firstName." ".$lastName; $ldaprecord['givenName'] = $firstName; $ldaprecord['sn'] = $lastName; $ldaprecord['mail'] = $email; $ldaprecord['objectclass'] = array("top","person","organizationalPerson","user"); $ldaprecord["sAMAccountName"] = $username; //$ldaprecord["unicodepwd"] = $newPassw; $ldaprecord["UserAccountControl"] = "544"; $r = ldap_add($ldap_conn, $dn, $ldaprecord); // set password .. not sure if I need to base64 encode or not $encodedPass = array('userpassword' => base64_encode($newPassw)); //$encodedPass = array('unicodepwd' => $newPassw); echo "Change password "; if(ldap_mod_replace ($ldap_conn, $dn, $encodedPass)){ echo "succeded"; }else{ echo "failed"; } } 

Всего два совета:

  1. Во время настройки AD CS на странице « Укажите тип установки» нажмите « Предприятие» , а затем нажмите «Далее».
  2. Служба AD должна взять себе собственный сертификат, но если он работает, как в Windows Server 2003, вы должны перезагрузить сервер, чтобы он работал. Возможно, просто остановите и перезапустите службу в W2K8 R2.

Afer, вы можете просто попытаться создать сертификат и установить его в учетной записи службы AD, как вы можете найти это с помощью ADAM.

Вы создали запрос сертификата для безопасного Ldap с правильными идентификаторами OID?

вот мой файл inf:

  [Version] Signature="$Windows NT$ [NewRequest] Subject = "CN=my-server.blahblah.com" ; must be the FQDN of host Exportable = TRUE ; TRUE = Private key is exportable KeyLength = 4096 ; Common key sizes: 512, 1024, 2048, ; 4096, 8192, 16384 KeySpec = 1 ; Key Exchange KeyUsage = 0xF8 ; Digital Signature, Non Repudiation, Key Encipherment, Data Encipherment, Key Agreement MachineKeySet = True ProviderName = "Microsoft RSA SChannel Cryptographic Provider" ProviderType = 12 RequestType = CMC ; Omit entire section if CA is an enterprise CA [EnhancedKeyUsageExtension] OID=1.3.6.1.5.5.8.2.2 OID=1.3.6.1.5.5.7.3.1 OID=1.3.6.1.5.5.7.3.2 OID=1.3.6.1.5.5.7.3.3 OID=1.3.6.1.5.5.7.3.4 OID=1.3.6.1.5.5.7.3.5 OID=1.3.6.1.5.5.7.3.6 OID=1.3.6.1.5.5.7.3.7 OID=1.3.6.1.5.5.7.3.8 OID=1.3.6.1.5.5.7.3.9 OID=1.3.6.1.4.1.311.10.3.4 OID=1.3.6.1.4.1.311.54.1.2 [RequestAttributes] CertificateTemplate = MySpecialTemplate ;Omit line if CA is a stand-alone CA SAN="my-server.blahblah.com" 

ВЫ ДОЛЖНЫ СДЕЛАТЬ ШАБЛОН НА ЦЕЛИ С ИСПОЛЬЗОВАНИЕМ 2003 ГОДА (НЕ ВСЕ МИКРОСОФТНЫЕ ПРОДУКТЫ МОГУТ ИСПОЛЬЗОВАТЬ 2008 ШАБЛОНЫ – Я ЗНАЮ СТУПИДУЮ ХУХ) КОПИРОВАТЬ ЭТО ОТ КОНТРОЛЛЕРА ДОМЕНА И ПРОТИВ КУХОННОГО РАКОВИНА НА МОРЯХ

Просто сделайте свою связь надежной. Тогда ему больше не нужны сертификаты. Проверьте javax.net.sslTrustManager .