LDAP 客户端通过 SSL 与 LDAP 服务器进行通信
2008-12-03 21:27
459 查看
LDAP 客户端包括如以下过程使用 Wldap 32.dll,任何进程:
使用 Active Directory Services Interfaces (ADSI) 来调用的过程。
使用 LDAP 从 Windows 通讯簿 (WAB) 的过程。 此过程会启动通过使用 Microsoft Outlook Express 或使用搜索对话框。
因为 Wldap 32.dll 是基础技术,代码示例将演示如何使用函数调用。 这被称为 LDAP API。
本节介绍如何获取 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 连接:
如果 LDAP 连接失败,您可能会收到以下错误信息:
0x51-LDAP_SERVER_DOWN
因为 ldap_connect() 函数调用是第一个函数调用由目录服务器取得联系的不能配置代码以解决此问题。 如果 ldap_connect() 函数调用成功,但 LDAP 调用失败的更高版本,这可能表示一个编程的问题并不是 SSL 问题。
可以使用以下方法来解决连接问题。
请尝试使用预先生成的 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。
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 连接到所需的端口上的主机。 如果,服务器可能无法提供,或者不能指定正确的端口。
使用 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 是用于消除常见的问题。
您可以使用该示例中,以下平台软件开发工具包 (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 标志:
您需要在代码中的多个位置中进行此更改。
如果生成一个错误,则请检查以确定以下代码:
什么是生成错误的函数?
什么是错误?
您可以将服务器名称放在本地计算机上 Hosts 文件中。 主机文件位于以下位置:
/%SystemRoot%/system32/drivers/etc/
这篇文章中的信息适用于:
Microsoft Active Directory Service Interfaces 2.5
转载地址:http://support.microsoft.com/kb/290483/zh-cn
使用 Active Directory Services Interfaces (ADSI) 来调用的过程。
使用 LDAP 从 Windows 通讯簿 (WAB) 的过程。 此过程会启动通过使用 Microsoft Outlook Express 或使用搜索对话框。
因为 Wldap 32.dll 是基础技术,代码示例将演示如何使用函数调用。 这被称为 LDAP API。
获取 SSL 连接
loadTOCNode(2, 'summary');本节介绍如何获取 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 问题。
疑难解答
loadTOCNode(2, 'summary');可以使用以下方法来解决连接问题。
方法 1: 验证没有如何调用函数或与开发环境出现问题
loadTOCNode(2, 'summary');请尝试使用预先生成的 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: 检查事件日志中的错误
loadTOCNode(2, 'summary');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
loadTOCNode(2, 'summary');使用 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 示例
loadTOCNode(2, 'summary');您可以使用该示例中,以下平台软件开发工具包 (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 文件中
loadTOCNode(2, 'summary');您可以将服务器名称放在本地计算机上 Hosts 文件中。 主机文件位于以下位置:
/%SystemRoot%/system32/drivers/etc/
这篇文章中的信息适用于:
Microsoft Active Directory Service Interfaces 2.5
转载地址:http://support.microsoft.com/kb/290483/zh-cn
相关文章推荐
- TCP通信的服务器(两个客户端通过服务器进行数据中转)
- 客户端与服务器之间分别通过TCP和UDP进行通信
- java通过ssl连接LDAP服务器(包括LDAP服务器搭建、openssl数字证书生成、openldap服务器配置启动)
- android端和pc端使用usb进行socket通信,其中android是服务器端,pc是客户端。如何实现安卓端输入的数据通过按钮发送到pc端?
- Android客户端通过socket与服务器通信
- http接口加密《一》:移动应用中,通过在客户端对访问的url进行加密处理来保护服务器上的数据
- 使用Socket进行一台服务器与多个Android客户端进行双向通信
- Android客户端通过socket与服务器通信
- Android手机客户端与服务器之间的通信、Android手机客户端通过服务器与Android手机客户端之间的通信---------阿冬专栏!!!
- SSL/TLS协议的运行原理浅,客户端与服务器的4次握手通信
- Android客户端与PC服务器通过socket进行交互实例
- 多台android设备通过服务器进行通信(socket)
- 【c#源码】安卓客户端通过TCP通信与Windows服务器进行文件传输
- 【Linux网络编程实例】实例二:利用TCP协议进行客户端与服务器通信
- Android客户端通过socket与服务器通信
- linux 网络编程:客户端与服务器通过TCP协议相互通信
- 初玩linux epoll------一个服务器如何与多个客户端进行通信? (笔试面试常考)
- Android编程之客户端通过socket与服务器通信的方法
- Android编程之客户端通过socket与服务器通信的方法
- 接口加密《一》:移动应用中,通过在客户端对访问的url进行加密处理来保护服务器上的数据