【问题标题】:Unable to bind sample program to LDAP server via SSL (ldaps://)无法通过 SSL (ldaps://) 将示例程序绑定到 LDAP 服务器
【发布时间】:2013-06-02 11:17:53
【问题描述】:

我这里有一个示例程序,它试图连接到安全端口 (ldaps://) 上的 LDAP 服务器。但是,示例程序无法绑定到服务器。

#define LDAP_DEPRECATED 1
#include <stdio.h>
#include <ldap.h>

#define BIND_DN "dc=example,dc=com"
#define BIND_PW "secret"

int main() {
    LDAP *ld;
    int rc;
    int reqcert = LDAP_OPT_X_TLS_NEVER;
    int version = LDAP_VERSION3;
    int ret(0);

    if (ldap_initialize (&ld, "ldaps://192.168.1.51:10636")) {
        perror("ldap_init"); /* no error here */
        return(1);
    }

    ldap_set_option (ld, LDAP_OPT_PROTOCOL_VERSION, &version);
    ldap_set_option (ld, LDAP_OPT_X_TLS_REQUIRE_CERT, &reqcert);

    rc = ldap_bind_s(ld, BIND_DN, BIND_PW, LDAP_AUTH_SIMPLE);

    if( rc != LDAP_SUCCESS )
    {
        fprintf(stderr, "ldap_simple_bind_s: %s\n", ldap_err2string(rc) );
        return( 1 );
    }
    printf("Initial Authentication successful\n");
    ldap_unbind(ld);
}

但是,使用 START_TLS,示例程序成功绑定到端口 10389 上运行的 LDAP 服务器。ldapsearch 客户端能够连接到服务器并搜索用户基础树。但上面的示例程序没有。

要使其与 START_TLS 一起使用: 这是我添加的内容:

ldap_set_option (ld, LDAP_OPT_X_TLS_REQUIRE_CERT, &reqcert);    
rc = ldap_start_tls_s(ld, NULL, NULL);
    if (rc != LDAP_SUCCESS) {
        printf("ldap_start_tls() %s",ldap_err2string(ret));
    }

有人能指出我在这里通过 ldaps:// 绑定到 LDAP 服务器缺少什么吗?

【问题讨论】:

  • 我对 C++ 不是很熟悉,但我之前在处理 LDAPS 的 C# 中看到过这个完全相同的错误。我们解决此问题的方法是始终在 VerifyServerCertificate 会话选项上返回 delegate {return true}ldapConnection.SessionOptions.VerifyServerCertificate += delegate { return true; }; 你能在 C++ 中做类似的事情吗?

标签: c++ c linux ldap openldap


【解决方案1】:

编辑/etc/openldap/ldap.conf,添加一行:

TLS_REQCERT 从不

然后再试一次。

【讨论】:

  • 这与将 ldap 结构选项“LDAP_OPT_X_TLS_REQUIRE_CERT”设置为“LDAP_OPT_X_TLS_NEVER”不同吗??
  • ldap_initialize 将读取配置文件。理论上,设置选项应该可以工作,有待调查的原因,...
  • 我从未在任何地方看到过此文档。谢谢。 ldap_init() 怎么样(虽然已弃用,但对我来说很好)?那会读取配置文件吗?还是 ldap_set_option() 优先?
  • 阅读所有细节的源代码,:) strace 也很有帮助
【解决方案2】:

您似乎正在尝试通过 SSL 端口建立 TLS 连接,但这是不可能的。这是wiki page on LDAP的引述:

有一个类似的非标准 ldaps:用于 LDAP over SSL 的 URL 方案。这不应与带有 TLS 的 LDAP 混淆,后者是通过使用标准 ldap: 方案的 StartTLS 操作实现的。

除非您的程序需要连接到一些非常旧的不支持 TLS 而只支持 SSL 的 LDAP 服务器,否则我建议始终使用 TLS。它至少和 SSL 一样安全。

但是,如果您需要创建 SSL 连接,我相信 this thread on openldap site 会有所帮助。简而言之,我认为(对不起,我没有检查这个的环境)你需要使用LDAP_OPT_X_TLS_CACERTFILE 而不是LDAP_OPT_X_TLS_REQUIRE_CERT。另外你不应该调用 ldap_start_tls_s,因为它会尝试建立 TLS 连接(你不想要的)。

【讨论】:

  • 我没有尝试在 SSL 端口上设置 TLS。我正在尝试设置 SSL 专用于 SSL 的端口(端口 10636)。另外,我没有证书来验证服务器。因此,我将“LDAP_OPT_X_TLS_REQUIRE_CERT”设置为“LDAP_OPT_X_TLS_NEVER”。相当于在 ldap.conf 文件中将 TLS_REQCERT 设置为 Never。
猜你喜欢
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多