我这里有一个示例程序试图连接到安全端口上的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: %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服务器的内容吗?// ??
答案 0 :(得分:0)
您似乎正在尝试通过SSL端口设置TLS连接,这是不可能的。以下是wiki page on LDAP:
的引用对于LDAP over SSL,存在类似的非标准ldaps:URL方案。这不应与LDAP与TLS混淆,后者是使用标准ldap:scheme使用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连接(您不需要)。
答案 1 :(得分:0)
编辑/etc/openldap/ldap.conf,添加行:
然后再试一次。TLS_REQCERT永远不会