我已经为 IIS 6.0 创建了一个 ISAPI 筛选器,它尝试使用 LDAP 针对 Active Directory 进行身份验证。当定期通过端口 389 进行身份验证时,过滤器工作正常,但是当我尝试使用 SSL 时,我总是在调用时遇到0x51 Server Down
错误。ldap_connect()
即使跳过连接调用并使用也会ldap_simple_bind_s()
导致相同的错误。
奇怪的是,如果我将应用程序池身份更改为本地管理员帐户,则过滤器可以正常工作并且 LDAP over SSL 成功。我用下面相同的代码创建了一个 exe,并以管理员身份在服务器上运行它,它可以工作。为站点的应用程序池使用默认的 NETWORK SERVICE 身份似乎是问题所在。关于正在发生的事情有什么想法吗?我想使用默认身份,因为我不希望该网站具有更高的管理员权限。
服务器位于运行 AD 的 DC 所在的网络和域之外的 DMZ 中。我们的 DC 上也有适用于 AD 的有效证书。
代码:
// Initialize LDAP connection
LDAP * ldap = ldap_sslinit(servers, LDAP_SSL_PORT, 1);
ULONG version = LDAP_VERSION3;
if (ldap == NULL)
{
strcpy(error_msg, ldap_err2string(LdapGetLastError()));
valid_user = false;
}
else
{
// Set LDAP options
ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, (void *) &version);
ldap_set_option(ldap, LDAP_OPT_SSL, LDAP_OPT_ON);
// Make the connection
ldap_response = ldap_connect(ldap, NULL); // <-- Error occurs here!
// Bind and continue...
}
更新:我创建了一个没有管理员权限的新用户,并以新用户身份运行测试 exe,但我遇到了同样的Server Down
错误。我将用户添加到管理员组并得到了同样的错误。似乎在此特定服务器上使用 LDAP over SSL 身份验证的唯一用户是管理员。
带有 ISAPI 过滤器的 Web 服务器(以及我运行测试 exe 的位置)正在运行 Windows Server 2003。带有 AD 的 DC 正在运行 2008 R2。
另外值得一提的是,我们在同一台服务器上有一个 WordPress 站点,该站点使用 PHP (OpenLDAP) 通过 SSL 对 LDAP 进行身份验证,这没有问题。我有一个指定的 ldap.conf 文件,TLS_REQCERT never
运行 PHP 代码的用户是 IUSR。
确保失败的用户信任您的 ldap 服务器的证书颁发机构。
为此,请以失败的用户身份登录(您可能必须为此授予临时权限,也许将其放在“远程桌面”组中)。在“受信任的根证书颁发机构”下启动
certmgr.msc
并查找您正在使用的证书颁发机构。将您看到的内容与管理员帐户中的内容进行比较。
我相信您遇到了信任商店问题。
请参阅http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/sag_cmuncertstor.mspx?mfr=true
测试此方法的示例方法可能是区分打印证书存储内容的基于文本的输出。