无法通过SSL (ldaps://)将示例程序绑定到LDAP服务器

Unable to bind sample program to LDAP server via SSL (ldaps://)

本文关键字:程序 例程 绑定 服务器 LDAP SSL ldaps      更新时间:2023-10-16

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

#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: %sn", ldap_err2string(rc) );
        return( 1 );
    }
    printf("Initial Authentication successfuln");
    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服务器://??

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

TLS_REQCERT从来没有

似乎您正在尝试通过SSL端口建立TLS连接,这是不可能的。以下是wiki页面上关于LDAP的一段话:

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

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

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