INTRODUCTION
本文介绍如何安装 Microsoft Windows 轻型目录访问协议 (LDAP) 客户端可以与一个 LDAP 服务器通过安全套接字层 (SSL) 通信。 本文还介绍解决方法, 可用如果遇到问题。
LDAP 客户包括任何进程, 如下列过程使用 Wldap32.dll:• 使用调用到 Active Directory Services Interfaces (ADSI) 过程。
• 使用 LDAP 从 Windows 通讯簿 (WAB) 过程。 通过使用 MicrosoftOutlookExpress 或通过使用搜索对话框启动此过程。
因为 Wldap32.dll 是基础技术, 代码示例将说明如何使用函数调用。 这称为 LDAPAPI。
获取 SSL 连接
本节介绍如何获取一个 SSL 连接。 LDAPAPI 不得不打开 IP 连接到 LDAP 服务器支持 SSL 通信上端口。 这是 TCP 端口 636 通常, 建立此连接后, LDAPAPI 启动握手, 然后尝试验证服务器。 服务器证书是否成功, 此握手是用来协商会话密钥。 会话密钥用于通过该连接加密其余的 LDAP 操作。
SSL 握手由名为 SChannel Microsoft TLS/SSL 安全提供程序执行。 这是同一安全提供程序处理 SSL handshakes 对其他协议, 如下:• HTTP
• 路由和远程访问
有关如何 SChannel 安全提供程序执行 SSL 握手, 请单击下列文章编号以查看 Microsoft 知识库中相应:
257591 (
http://support.microsoft.com/kb/257591/) 对安全套接字层 (SSL) 握手说明
当 LDAPAPI 执行握手, 客户验证不执行除非 QUERYCLIENTCERT 函数通过连接选项设置。 通常, 握手只涉及标识服务器。 有关识别服务器, 请单击下列文章编号以查看 Microsoft 知识库中相应:
257587 (
http://support.microsoft.com/kb/257587/) SSL 握手期间描述服务器身份验证过程
如果以前文章中步骤之一失败, SSL 握手失败, 并不创建 LDAP 连接。
可用于以下 LDAPAPI 示例代码创建一个 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: 验证, 则是与如何调用函数或与开发环境不有问题
尝试使用预置 WindowsLDAP 客户来执行搜索。 如果在开发计算机是基于 Windows 2000 的计算机, 使用 Ldp.exe 支持工具。 如果在开发计算机是不基于 Windows 2000 的计算机, 使用 WAB。 如果 LDAP 服务器接受标准 LDAP 请求, 还尝试此。 通常, 标准 LDAP 端口是 TCP 端口 389。 如果无法连接通过标准 LDAP 端口, SSL 握手不可能问题。
有关配置 WAB, 请单击下列文章编号以查看 Microsoft 知识库中相应:
238007 (
http://support.microsoft.com/kb/238007/) 如何配置通讯簿向 ActiveDirectory 中查询用户
当尝试使用预置 WindowsLDAP 客户, 和是不成功, 但其他 WindowsLDAP 客户是成功, 这表明有是问题特定于应用。 您必须验证, 正确设置开发环境并且函数调用被进行正确。 有关可能原因, 请单击下列文章编号以查看 Microsoft 知识库中相应:
283199 (
http://support.microsoft.com/kb/283199/) 某些 LDAPAPI 函数引发错误调用时
如果其他 Windows LDAP 客户端失败, 请参阅方法 2。
方法 2: 检查事件日志的错误
SChannel 安全提供程序将错误记录到系统日志在 Microsoft Window 2000 和 Microsoft WindowsNT 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 错误代码
如果记录没有错误, 尝试启用对成功 " 日志 " 事件。 有关 " 日志对成功 " 事件, 请单击下列文章编号以查看 Microsoft 知识库中相应:
260729 (
http://support.microsoft.com/kb/260729/) 如何启用 Schannel 日志
如果将日志表明正在生成客户端上下文, 并, SSL 握手成功, 表明 SSL 连接创建后, 发生问题。
如果没有记录生成, 该连接由于其他原因失败。 此例, 用于 Telnet 连接到了所需端口上主机。 如果这失败, 服务器可能不可用, 或不正确端口可能被指定。
方法 3: 使用 Microsoft Internet Explorer
您可使用 InternetExplorer 来解决 LDAP SSL 连接通过
https://Hostname.corp.com:636 位于窗体中键入 URL。 InternetExplorer 尝试协商 SSL 握手。 如果 InternetExplorer 是成功, 然后 InternetExplorer 不 HTTPGet 请求失败, 并可能收到以下错误信息:
未找到页
如果有服务器验证问题, InternetExplorer 显示问题并再提供建议。
确实 InternetExplorer 不表现完全像 LDAPAPI 当服务器验证行为。 但是, InternetExplorer 是用于消除常见问题。
方法 4: 使用 Microsoft 平台 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
要更接近模仿, SChannel 安全提供程序, 对 LDAP 调用您需要修改源代码。 将五个参数的 AcquireCredentialHandle 函数更改为 NULL。 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\