使用LDAP/PHP/IIS/SSL更改Active Directory中的密码
首先,这可能不是一个编程问题,而更多的是一个如何配置LDAPS的问题,但下面是 背景信息: 我有两台Windows 2008 R2服务器。一个是带有Active Directory(AD)的域控制器(DC),我想通过LDAP与之通信。这个名为TestBox.TestDomain.local。另一台服务器运行IIS、PHP(使用ldap和openssl)和mySQL 什么有效/无效: 我可以通过端口389成功连接到DC,并将数据读/写到AD。我不能做的是更改或设置用户密码,因为这需要通过端口636使用LDAP(LDAP w/SSL)进行安全连接 我需要什么帮助: 我已尝试安装Active Directory证书服务(AD CS)并使用此处找到的信息将DC配置为证书颁发机构(CA):但无论我尝试什么,我都无法通过LDAP建立连接 示例代码: 创建LDAP连接使用LDAP/PHP/IIS/SSL更改Active Directory中的密码,php,iis,ssl,passwords,ldap,Php,Iis,Ssl,Passwords,Ldap,首先,这可能不是一个编程问题,而更多的是一个如何配置LDAPS的问题,但下面是 背景信息: 我有两台Windows 2008 R2服务器。一个是带有Active Directory(AD)的域控制器(DC),我想通过LDAP与之通信。这个名为TestBox.TestDomain.local。另一台服务器运行IIS、PHP(使用ldap和openssl)和mySQL 什么有效/无效: 我可以通过端口389成功连接到DC,并将数据读/写到AD。我不能做的是更改或设置用户密码,因为这需要通过端口636
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!");
}
}
函数ldapConnect(){
$ip=“100.200.300.400”///WAN ip在这里;
$ldap\u url=“ldap://$ip”;
$ldaps\u url=“ldaps://$ip”;
$ldap_domain='testdomain.local';
$ldap_dn=“dc=testdomain,dc=local”;
//不安全-工程
$ldap_conn=ldap_connect($ldap_url)或die(“无法连接到ldap服务器($ldap_url)”);
//交替连接法
//$ldap_conn=ldap_connect($ip,389)或die(“无法连接到ldap服务器(ip:$ip,端口:389)”);
//安全-不工作
//$ldap_conn=ldap_connect($ldaps_url)或die(“无法连接到ldap服务器($ldaps_url)”);
//交替连接法
//$ldap_conn=ldap_connect($ip,636)或die(“无法连接到ldap服务器(ip:$ip,端口:636)”);
ldap_设置_选项($ds,ldap_选项_协议_版本,3);
ldap_设置_选项($ds,ldap_选项_引用,0);
$username=“AdminUser”;
$password=“AdminPass”;
//使用管理员用户名和密码绑定
//也可以使用dn…即CN=Administrator,CN=Users,DC=TestDomain,DC=local
$result=ldap\u bind($ldap\u conn,$username@$ldap\u domain,$password)或die(
错误:无法使用提供的凭据绑定到服务器!);
如果($结果){
返回$ldap_conn;
}否则{
死(
错误:无法使用提供的凭据绑定到服务器!);
}
}
将新用户添加到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";
}
}
函数ldapAddUser($ldap\u conn、$ou\u dn、$firstName、$lastName、$username、$pwdtxt、$email){
$dn=“CN=$firstName$lastName,”。$ou\u dn;
##创建Unicode密码
$newPassword=“\”.$pwdtxt.\”;
$len=strlen($newPassword);
$newPassw=“”;
对于($i=0;$i base64_encode($newPassw));
//$encodedPass=array('unicodepwd'=>$newPassw);
回显“更改密码”;
如果(ldap_mod_replace($ldap_conn,$dn,$encodedPass)){
回声“成功”;
}否则{
echo“失败”;
}
}
只有两条建议:
之后,您可以尝试构建一个证书并将其安装到广告服务帐户上,就像您可以通过ADAM完成一样。只需将您的连接设置为“信任所有”。那么它就不再需要证书了。检查
javax.net.sslTrustManager
是否使用正确的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"
您应该使用2003在CA上制作一个模板(不是所有MICROSOFT产品都可以使用2008模板——我知道这很愚蠢),从域控制器复制它,然后将厨房水槽扔到OID上这与什么有关系?嘿,我只是想知道这是否最终对您有效,以及您必须做什么。我也有类似的问题。你刚刚重新启动了windows服务器吗?我改变了处理这个问题的方式。最后,我使用LDIF脚本设置密码。