现在的位置: 首页 > 综合 > 正文

LDAP 客户端通过 SSL 与 LDAP 服务器进行通信

2013年10月13日 ⁄ 综合 ⁄ 共 4123字 ⁄ 字号 评论关闭
 LDAP 客户端包括如以下过程使用 Wldap 32.dll,任何进程:

  • 使用 Active Directory Services Interfaces (ADSI) 来调用的过程。
  • 使用 LDAP 从 Windows 通讯簿 (WAB) 的过程。 此过程会启动通过使用 Microsoft Outlook Express 或使用搜索对话框。

因为 Wldap 32.dll 是基础技术,代码示例将演示如何使用函数调用。 这被称为 LDAP API。

获取 SSL 连接


本节介绍如何获取 SSL 连接。 LDAP API 必须打开一个到支持 SSL 通信的 LDAP 服务器上的一个端口的 IP 连接。 通常,这是 TCP 端口 636。 在进行此连接之后,LDAP API 将启动一个握手,,然后尝试验证服务器。 成功此握手是否与服务器证书用于协商会话密钥。 会话密钥用于加密的 LDAP 其余部分通过该连接的操作。

SSL 握手由 Microsoft TLS/SSL Security Provider 名为 SChannel 的执行。 这是同一个安全提供程序处理 SSL 握手其他协议,如下所示:

  • HTTP
  • 路由和远程访问

有关如何 SChannel 安全提供程序执行 SSL 握手的其他信息,单击下面的文章编号,以查看 Microsoft 知识库中的文章:

257591  (http://support.microsoft.com/kb/257591/ ) 安全套接字层 (SSL) 握手说明

在 LDAP API 执行在握手,除非 QUERYCLIENTCERT 函数通过使用连接选项设置不进行客户端身份验证。 通常,在握手只需要标识服务器。 有关确定服务器的其他信息,单击下面的文章编号,以查看 Microsoft 知识库中的文章:

257587  (http://support.microsoft.com/kb/257587/ ) 服务器身份验证过程的描述,在 SSL 握手期间

如果任一以前文章中的该步骤失败,SSL 将失败握手并不创建 LDAP 连接。

使用下面的 LDAP API 示例代码,可以创建 SSL 连接:

// Link with Wldap32.lib.
#include <windows.h>
#include <winldap.h>
#include <stdio.h>


int main(int argc, char* argv[])
{
	LDAP *ldapConnection = NULL;
	INT err = 0;
	PCHAR pHost = "Host_Name";  // Change this value to the HostName that you want.
	ULONG ulPort = LDAP_SSL_PORT; // Change this value to the port that you want.

	ldapConnection = ldap_sslinit(pHost,ulPort, 1);
	if ( ldapConnection == NULL ) {
		printf( "ldap_sslinit failed with 0x%x./n", GetLastError() );
		return 0;
	}

	err = ldap_connect(ldapConnection,0);
	if (err != LDAP_SUCCESS )
		goto FatalExit;
	// Do LDAP work here.

FatalExit:

	if (ldapConnection)
		ldap_unbind_s(ldapConnection);
	printf("/n/n Error return : 0x%x/n",err);
	return err;
}

如果 LDAP 连接失败,您可能会收到以下错误信息:

0x51-LDAP_SERVER_DOWN

因为 ldap_connect() 函数调用是第一个函数调用由目录服务器取得联系的不能配置代码以解决此问题。 如果 ldap_connect() 函数调用成功,但 LDAP 调用失败的更高版本,这可能表示一个编程的问题并不是 SSL 问题。

疑难解答


可以使用以下方法来解决连接问题。

方法 1: 验证没有如何调用函数或与开发环境出现问题


请尝试使用预先生成的 Windows LDAP 客户端执行搜索。 如果开发计算机是基于 Windows 2000 的计算机,使用 Ldp.exe 支持工具。 如果开发计算机不是一个基于 Windows 2000 的计算机,请使用 WAB 的目标。 如果 LDAP 服务器接受标准的 LDAP 请求,请尝试这也。 通常,标准的 LDAP 端口是 TCP 端口 389。 如果您无法通过标准的 LDAP 端口连接的 SSL 握手可能无法问题。

有关配置 WAB 的目标的其他信息,单击下面的文章编号,以查看 Microsoft 知识库中的文章:

238007  (http://support.microsoft.com/kb/238007/ ) 如何配置通讯簿包含在 Active Directory 中查询用户

您尝试使用预先生成的 Windows LDAP 客户端和不成功,但其他 Windows LDAP 客户端成功时, 这表明存在特定于您的应用程序的问题。 您必须验证在开发环境设置正确,并的函数调用都进行正确。 有关可能的原因单击下面的文章编号,以查看 Microsoft 知识库中的相应:

283199  (http://support.microsoft.com/kb/283199/ ) 某些 LDAP API 函数会引发错误调用时

如果其他 Windows LDAP 客户端无法,请参阅方法 2。

方法 2: 检查事件日志中的错误


SChannel 安全提供程序记录到系统日志在 Microsoft Window 2000 和 Microsoft Windows NT 4.0 中的错误。 情况默认,如果要使用 Windows 2000 客户端启用错误日志记录。 有关如何启用 Windows NT 4.0 客户端的日志记录单击下面的文章编号,以查看 Microsoft 知识库中的相应:

260729  (http://support.microsoft.com/kb/260729/ ) 如何启用 Schannel 日志记录

您完成在上一文章中的步骤之后,您不得不重新启动计算机,然后再试方法 1。

您还必须确定错误说明时记录了错误。 有关如何查找错误说明单击下面的文章编号,以查看 Microsoft 知识库中的相应:

232282  (http://support.microsoft.com/kb/232282/ ) 在 Windows 2000 中的 Active Directory 服务接口错误代码

如果没有错误记录,尝试启用"日志成功"事件。 有关"日志成功"事件单击下面的文章编号,以查看 Microsoft 知识库中的相应:

260729  (http://support.microsoft.com/kb/260729/ ) 如何启用 Schannel 日志记录

如果您的日志指出,您正在生成一个客户端上下文,SSL 握手成功,这表明 SSL 连接创建后出现此问题。

如果不生成任何日志记录,则可能会有其他原因无法连接。 在这种情况下使用 Telnet 连接到所需的端口上的主机。 如果,服务器可能无法提供,或者不能指定正确的端口。

方法 3: 使用 Microsoft Internet Explorer


使用 Internet Explorer 解决 LDAP SSL 连接在 https://hostname.corp.com:636 窗体中输入 URL。 Internet Explorer 尝试协商 SSL 握手。 成功 Internet Explorer 是否 Internet Explorer 然后 does 的 HTTP Get 请求失败,并且您可能会收到下面的错误信息:

未找到页面

如果有服务器验证问题,Internet Explorer 将显示问题并提供了建议。

Internet Explorer 不行为,完全像该服务器进行验证时,LDAP API 的行为。 但是,Internet Explorer 是用于消除常见的问题。

方法 4: 使用 Microsoft Platform SDK 中的 WebClient 示例


您可以使用该示例中,以下平台软件开发工具包 (SDK) 而不是使用 LDAP 的:

http://www.microsoft.com/msdownload/platformsdk/sdkupdate/ (http://www.microsoft.com/msdownload/platformsdk/sdkupdate/)

安装之后, 您可以找到此示例在以下位置:

/Microsoft SDK/Samples/security/SSPI/SSL/WebClient/webclient.c

要更加紧密地模仿 LDAP 对 SChannel 安全提供程序调用,必须修改在源代码。 更改为 NULL 的 AcquireCredentialHandle 函数的第五个参数。 dwSSPIFlags 变量必须包含类似于以下的 ISC_REQ_MUTUAL_AUTH 标志:

    dwSSPIFlags = ISC_REQ_SEQUENCE_DETECT   |
                  ISC_REQ_REPLAY_DETECT     |
                  ISC_REQ_CONFIDENTIALITY   | 
                  ISC_RET_EXTENDED_ERROR    |
                  ISC_REQ_ALLOCATE_MEMORY   |
                  ISC_REQ_STREAM |
		  ISC_REQ_MUTUAL_AUTH ;

您需要在代码中的多个位置中进行此更改。

如果生成一个错误,则请检查以确定以下代码:

  • 什么是生成错误的函数?
  • 什么是错误?

方法 5: 将服务器名称放在本地计算机上 Hosts 文件中


您可以将服务器名称放在本地计算机上 Hosts 文件中。 主机文件位于以下位置:

/%SystemRoot%/system32/drivers/etc/

这篇文章中的信息适用于:
  • Microsoft Active Directory Service Interfaces 2.5

转载地址:http://support.microsoft.com/kb/290483/zh-cn

抱歉!评论已关闭.