我已为 IIS 6.0 创建了一个 ISAPI 筛选器,该筛选器尝试使用 LDAP 针对 Active Directory 进行身份验证。在通过端口 389 定期进行身份验证时,该筛选器工作正常,但当我尝试使用 SSL 时,调用时总是出现错误0x51 Server Down
。ldap_connect()
即使跳过 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。
答案1
确保失败的用户信任您的 ldap 服务器的证书颁发机构。
为此,请以失败的用户身份登录(您可能必须为此授予临时权限,也许将其放在“远程桌面”组中)。启动certmgr.msc
并在“受信任的根证书颁发机构”下查找您正在使用的证书颁发机构。
将您看到的内容与管理员帐户中的内容进行比较。
答案2
我相信您遇到了信任商店问题。
测试这一点的一个示例方法可能是对打印证书存储内容的基于文本的输出进行差异分析。