使用 LDAP/PHP/IIS/SSL 在 Active Directory 中更改密码
Posted
技术标签:
【中文标题】使用 LDAP/PHP/IIS/SSL 在 Active Directory 中更改密码【英文标题】:Change Password in Active Directory using LDAP/PHP/IIS/SSL 【发布时间】:2011-04-19 15:47:36 【问题描述】:首先,这可能不是一个编程问题,而更像是一个如何配置 LDAPS 问题,但这里是……
背景信息:
我有两台 Windows 2008 R2 服务器。一个是带有 Active Directory (AD) 的域控制器 (DC),我想通过 LDAP 与之通信。这个名为 TestBox.TestDomain.local。另一台服务器正在运行 IIS、php(带有 ldap 和 openssl)和 mysql。
什么是/不工作:
我可以通过端口 389 成功连接到不安全的 DC 并将数据读/写到 AD。我不能做的是更改或设置用户密码,因为这需要通过端口 636 使用 LDAPS(带 SSL 的 LDAP)进行安全连接。
我需要什么帮助:
我已尝试安装 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";
【问题讨论】:
嘿,只是想知道这最终是否对您有用以及您必须做什么。我有非常相似的问题。你刚刚重启了windows服务器吗? 我最终改变了我处理这个问题的方式。最后,我使用 LDIF 脚本设置了密码。 【参考方案1】:只有两条建议:
-
在 AD CS 设置过程中,在 Specify Setup Type 页面中,单击 Enterprise,然后单击 Next。
AD 服务应该使用自己的证书,但如果它像在 Windows Server 2003 中一样工作,则必须重新启动服务器才能使其工作。也许只是停止并重新启动 W2K8 R2 中的服务。
之后,您可以尝试构建证书并将其安装在 AD 服务帐户上,就像您可以使用 ADAM 一样。
【讨论】:
【参考方案2】:您是否为具有正确 OID 的安全 Ldap 创建了证书请求?
这是我的 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"
你应该在 CA 上使用 2003 制作一个模板(不是所有的微软产品都可以使用 2008 模板——我知道很蠢)从域控制器中复制它并将厨房水槽扔在 OIDS 上
【讨论】:
【参考方案3】:只需让您的连接成为信任所有人。然后它将不再需要证书。查看javax.net.sslTrustManager
。
【讨论】:
这跟什么有什么关系?以上是关于使用 LDAP/PHP/IIS/SSL 在 Active Directory 中更改密码的主要内容,如果未能解决你的问题,请参考以下文章
警告:测试中对 App 的更新未包含在酶和钩子中的 act(...) 中