Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法通过SSL将示例程序绑定到LDAP服务器(ldaps://)_C++_C_Linux_Ldap_Openldap - Fatal编程技术网

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

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

我这里有一个示例程序,它试图通过安全端口(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);
}

有人能指出我在这里缺少的关于通过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));
    }