使用LDAP/PHP/IIS/SSL更改Active Directory中的密码

使用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

首先,这可能不是一个编程问题,而更多的是一个如何配置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连接

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“失败”;
}
}

只有两条建议:

  • 在AD CS设置过程中,在指定设置类型页面中,单击企业,然后单击下一步
  • 广告服务应该自己获取自己的证书,但如果它像在WindowsServer2003中一样工作,则必须重新启动服务器才能使其工作。也许只是停止并重新启动W2K8 R2中的服务

  • 之后,您可以尝试构建一个证书并将其安装到广告服务帐户上,就像您可以通过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脚本设置密码。