无法通过SSL (ldaps://)将示例程序绑定到LDAP服务器
Unable to bind sample program to LDAP server via SSL (ldaps://)
我在这里有一个示例程序,它试图连接到安全端口上的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连接(这是您不想要的)。
相关文章:
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- c++类声明时,相同的例程,不同的成员变量类型
- C++为线程工作动态地分割例程
- 子例程,不使用 pow,并带有参数和返回
- 直接在RcppArmadillo中调用LAPACK例程
- 如何将C++子例程链接到 x86 程序集程序?
- PX 转换例程编译问题
- 成功完成TLS握手后,服务器关闭时出现错误的SSL例程:SSL3_GET_RECORD:错误的版本号
- 只允许授权代码调用库中的例程
- JNI 不满意链接错误: 动态链接库 (DLL) 初始化例程失败
- 调用子例程时类型不匹配
- 将分配给C++数组传递给 Fortran 子例程
- Android Studio 3.1.2 - 无法运行C++子例程"No implementation found for Java.lang.String..."
- Posix 线程类和启动例程 (pthread)
- OpenBLAS 只为一个例程设置线程数
- 检查并行化 BLAS 例程的结果
- 位置实用程序例程与使用类型相同的命名空间
- Qt事件后,长例程冻结了我的应用程序一段时间
- 为多线程程序增强非阻塞读写例程
- 从c++程序中调用Stan例程