我正在为我们在 DMZ 中运行的 Web 服务器编写 ISAPI 过滤器。此 ISAPI 过滤器需要连接到我们的内部域 Controller 以针对 Active Directory 进行身份验证。防火墙中有一条规则允许从 DMZ 服务器到我们的域 Controller 的端口 636 上的流量,并且防火墙显示流量正常通过。问题出在ldap_connect()功能。我收到错误 0x51 Server Down尝试建立连接时。我们使用域 Controller 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 在同一个域内,它可以工作,LDAP 和 LDAP over SSL。我们通过 Active Directory 注册策略在域 Controller 上安装了服务器证书,但我在其他地方读到我可能还需要安装客户端证书(用于我们的 Web 服务器)。这是真的?

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

谢谢!

请您参考如下方法:

通过将 CA 添加到 Web 服务器上的证书库来解决问题。 CA 以前从未被复制过。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!