【问题标题】:Windows LDAP API: No connection over SSLWindows LDAP API:无 SSL 连接
【发布时间】:2016-05-25 13:23:28
【问题描述】:

我正在尝试使用 Windows LDAP C-API 通过 SSL 连接到 LDAP 目录。此操作失败,错误代码为 0x51 = LDAP_SERVER_DOWN,而客户端计算机上的事件日志具有以下内容: „从远程服务器收到的证书不包含预期的名称。因此无法确定我们是否连接到正确的服务器。我们期待的服务器名称是 eim-tsi2.sam.develop.beta.ads。 SSL 连接请求失败。附加数据包含服务器证书。”

这是不可能的,因为“Ldap Admin”能够通过 SSL 和端口 636 进行连接。

LDAP 目录是一个 Oracle DSEE,它在适当的证书存储中具有 CA 和服务器证书。 客户端在“受信任的根证书颁发机构”和“本地计算机”实体商店中安装了 CA。我认为这是 CA 的正确位置,因为我的小客户端程序使用 Windows LDAP C-API; LDAP 管理员确实希望 CA 在那里。

这是我的程序的摘录,省略了错误处理和其他明显的源代码:

   ld = ldap_sslinit(host, LDAP_SSL_PORT, 1);
   // Set options: LDAP version, timeout ...
   rc = ldap_set_option(ld, LDAP_OPT_SSL, LDAP_OPT_ON);
   // Now connect:
   rc = ldap_connect(ld, NULL);

结果: 0x51 = LDAP_SERVER_DOWN

不使用 SSL 连接成功,因此通常可以访问 LDAP 服务器。

由于 Ldap Admin 能够通过 SSL 连接,我假设证书是有效的并且在正确的位置。但显然 LDAP API 期望它们在其他地方并且无法从服务器获取服务器证书。我按照此处所述配置了证书:https://msdn.microsoft.com/en-us/library/aa366105%28v=vs.85%29.aspx

我做错了什么?

【问题讨论】:

  • LDAP 服务器是否真的在监听LDAP_SSL_PORT,这可能是端口 636?
  • 我想是的。我首先尝试使用古老且不再维护的 Netscape C API 和 NSS 库通过 SSL 进行连接。它在端口 636 上成功。
  • 你可以访问openssl吗?如果是这样,请运行openssl s_client -connect host:636,将host 替换为您的LDAP 服务器的实际主机名或IP 地址。这应该告诉您连接中使用的特定协议和密码套件 - 也许您的服务器和 Windows 客户端在那里没有共同的设置。您还可以运行openssl s_client -connect host:636 | openssl x509 -text 以可读格式转储服务器的证书。
  • 另外,检查您在 Windows 客户端上安装的服务器证书。转到“Internet 选项-> 内容-> 证书-> 受信任的根证书颁发机构”(您安装服务器证书的位置)。选择您的服务器的证书,然后单击“高级”按钮。 (这就是我的 Windows 7 笔记本电脑上的内容)确保选择了正确的证书用途。 IIRC“服务器身份验证”是重要的,但可能还有其他。查看来自实际受​​信任机构的一些证书。
  • @andrew 您建议检查客户端上的“服务器证书”。我在客户端的“受信任的根等”中安装了 CA。但不是服务器证书。你是这个意思吗?安装在客户端上的 CA 设置了“服务器身份验证”属性。我在服务器和客户端上运行了您建议的 openssl 命令。除了“Master-key”的值之外,输出是相同的。那么为什么 LDAPAdmin 能够通过 SSL 进行连接,而同一台计算机上的客户端程序却不能呢? Windows LDAP 库是否需要其他地方的证书或其他形式的证书?

标签: c windows ssl ldap


【解决方案1】:

有时它有助于更​​仔细地阅读错误消息。由 SSL 绑定不成功导致的事件查看器中的条目是“我们期望的服务器名称是 eim-tsi2.sam.develop.beta.ads。”

我应该注意到名称应该是 eim-tsi2.cgn.de.(etc.),而不是。所以域名部分是错误的。

这是 Schannel 中的一个错误,可以通过注册表中的条目来解决,如下所述:https://support.microsoft.com/en-us/kb/2275950

我仍然不知道为什么 LDAPAdmin 能够在没有附加注册表项的情况下进行连接,尽管它也使用 WINLDAP API,因此应该遇到相同的错误。但这已经不重要了。

感谢安德鲁,您的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-24
    • 2012-08-30
    • 2014-12-19
    • 1970-01-01
    • 2014-11-10
    • 2016-01-09
    • 2013-06-25
    相关资源
    最近更新 更多