C++ 无法通过SSL将示例程序绑定到LDAP服务器(ldaps://)
我这里有一个示例程序,它试图通过安全端口(ldaps://)连接到LDAP服务器,但是,示例程序无法绑定到服务器C++ 无法通过SSL将示例程序绑定到LDAP服务器(ldaps://),c++,c,linux,ldap,openldap,C++,C,Linux,Ldap,Openldap,我这里有一个示例程序,它试图通过安全端口(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
#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);
}
有人能指出我在这里缺少的关于通过ldaps绑定到LDAP服务器的内容吗://?您似乎正在尝试通过SSL端口设置TLS连接,这是不可能的。以下是一段引用自: 对于SSL上的LDAP,也有一个类似的非标准ldaps:URL方案。这不应与LDAP和TLS混淆,后者是使用标准LDAP:scheme使用StartTLS操作实现的 除非您的程序需要连接到一些非常旧的LDAP服务器,这些服务器不支持TLS,而只支持SSL,否则我建议您始终使用TLS。它至少和SSL一样安全
但是,如果您需要创建SSL连接,我相信这会有所帮助。简言之,我认为(对不起,我没有环境来检查这一点)您需要使用
LDAP\u OPT\u X\u TLS\u CACERTFILE
而不是LDAP\u OPT\u X\u TLS\u REQUIRE\u CERT
。另外,您不应该调用ldap\u start\u tls\s,因为它将尝试建立tls连接(您不希望这样)。编辑/etc/openldap/ldap.conf,添加行:
TLS_请求证书从不
然后重试。我没有尝试在SSL端口上设置TLS。我正在尝试设置SSL专用于SSL的端口(端口10636)。此外,我没有验证服务器的证书。因此,我将“LDAP_OPT_X_TLS_REQUIRE_CERT”设置为“LDAP_OPT_X_TLS_NEVER”。。相当于在ldap.conf文件中将TLS_REQCERT设置为Never。这是否与将ldap结构选项“ldap_OPT_X_TLS_REQUIRE_CERT”设置为“ldap_OPT_X_TLS_Never”相同?ldap_initialize将读取配置文件。从理论上讲,设置选项应该有效,需要调查的原因,……我从未在任何地方看到过这种记录。谢谢ldap_init()怎么样(虽然不推荐使用,但对我来说没问题)??这会读取配置文件吗??或者,LDAPHStIOPopOutOTE()对所有的细节都使用优先级?URAD源代码,)Strues有助于我对C++不太熟悉,但是在C语言处理LDAP之前,我已经看到了这个完全相同的错误。我们解决这个问题的方法是在
VerifyServerCertificate
会话选项上始终返回delegate{return true}
:ldapConnection.SessionOptions.VerifyServerCertificate+=delegate{return true;}代码> C++中你能做类似的事情吗?
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));
}