ISAPI筛选DMZ服务器上的LDAP身份验证错误

时间:2012-06-18 23:50:24

标签: ssl active-directory ldap isapi dmz

我正在为我们在DMZ中运行的Web服务器编写ISAPI过滤器。此ISAPI筛选器需要连接到我们的内部域控制器以对Active Directory进行身份验证。防火墙中有一条规则允许从DMZ服务器到端口636上的域控制器的流量,防火墙显示流量正好通过。问题在于ldap_connect()功能。尝试建立连接时收到错误0x51 Server Down。我们使用域控制器IP地址而不是DNS名称,因为Web服务器位于域外。

ISAPI LDAP连接代码:

// Set search criteria
strcpy(search, "(sAMAccountName=");
strcat(search, username);
strcat(search, ")");

// Set timeout
time.tv_sec = 30;
time.tv_usec = 30;

// Setup user authentication
AuthId.User = (unsigned char *) username;
AuthId.UserLength = strlen(username);
AuthId.Password = (unsigned char *) password;
AuthId.PasswordLength = strlen(password);
AuthId.Domain = (unsigned char *) domain;
AuthId.DomainLength = strlen(domain);
AuthId.Flags = SEC_WINNT_AUTH_IDENTITY_ANSI;

// Initialize LDAP connection
ldap = ldap_sslinit(servers, LDAP_SSL_PORT, 1);

if (ldap != NULL)
{
    // 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
    //
    // FAILS HERE!
    //
    ldap_response = ldap_connect(ldap, &time);

    if (ldap_response == LDAP_SUCCESS)
    {
        // Bind to LDAP connection
        ldap_response = ldap_bind_s(ldap, (PCHAR) AuthId.User, (PCHAR) &AuthId, LDAP_AUTH_NTLM);
    }
}

// Unbind LDAP connection if LDAP is established
if (ldap != NULL)
    ldap_unbind(ldap);

// Return string
return valid_user;

servers = <DC IP Address>

我已经在与AD相同的域中的本地计算机上测试了此代码,它可以通过SSL使用LDAP和LDAP。我们在Active Directory注册策略的域控制器上安装了服务器证书,但我在其他地方读到了我可能还需要安装客户端证书(对于我们的Web服务器)。这是真的?

此外,我们在同一个DMZ Web服务器上运行一个单独的wordpress站点,该服务器通过SSL连接到LDAP就好了。它使用OpenLDAP通过PHP连接并使用我们域控制器的IP地址进行连接。我们有一个ldap.conf文件,其中包含一行代码:TLS_REQCERT never。有没有办法模仿Visual C中的这种效果我正在尝试为ISAPI过滤器做什么?希望这是一个编程问题而不是证书问题。如果这不属于编程领域,请告诉我或将我重定向到更好的位置发布。

谢谢!

1 个答案:

答案 0 :(得分:1)

通过将CA添加到Web服务器上的证书存储区来解决此问题。以前从未复制过CA.