我有一些使用社区版OpenLDAP的代码。应用程序是客户端。
要使用ldap_sasl_bind_s
与LDAP服务器建立连接,这看起来或多或少是这样的:
char *nAuthOption = LDAP_SASL_SIMPLE;
struct berval pPassword = {
m_Credentials.m_sPassword.length(),
const_cast<char *>(m_Credentials.m_sPassword.c_str())
};
nStatus = ldap_sasl_bind_s(m_pLDAPConnection,
m_Credentials.m_sUsername.c_str(),
nAuthOption,
&pPassword,
NULL,
NULL,
&servercredp);
free(nAuthOption);
if (nStatus!=LDAP_SUCCESS)
{
LOGE() << METHOD_NAME << "Failed to bind to LDAP " << LDAPError(nStatus);
return false;
}
return true;
现在问题是错误报告。我有一个客户端随机无法连接到LDAP服务的情况,在日志中我只能看到信息:
无法绑定到LDAP状态:-1(0xffffffff):无法联系LDAP服务器
事实证明这是无用的信息。经过长时间的调查,我们发现问题是其中一个可能的服务器不支持TLS协议(出于安全原因,安全连接仅限于TLS协议)。
现在,在日志中使用比Can't contact LDAP server
更方便的东西会更好。我想从OpenLDAP使用的OpenSSL上下文中获取错误,但我找不到一个好方法。
我可以获取更详细的信息ldap_sasl_bind_s失败的原因吗?我可以抓取SSL_CTX *
,但不知道我能用它做什么。
答案 0 :(得分:0)
我从OpenLDAP获取更详细信息的一种方法是为libber
库提供日志回调,如下所示:
#if defined(LBER_OPT_LOG_PRINT_FN)
static void ldap_debug_cb(const char *msg) {
/* Write out message to e.g. stderr */
fprintf(stderr, "LDAP debug: %s\n", msg);
}
#endif /* no LBER_OPT_LOG_PRINT_FN */
#if defined(LBER_OPT_LOG_PRINT_FN)
if (ber_set_option(NULL, LBER_OPT_LOG_PRINT_FN, ldap_debug_cb) != LBER_OPT_SUCCESS) {
/* Log error about setting option/callback */
}
#endif /* LBER_OPT_LOG_PRINT_FN */
请注意,您可能还需要确保将OpenLDAP LDAP_DEBUG_LEVEL
选项设置为足够高的级别:
LDAP *ldap = ...
/* This debug level value should be LDAP_DEBUG_ANY, but that macro is, I
* think, OpenLDAP-specific.
*/
int debug_level = -1;
if (ldap_set_option(ldap, LDAP_OPT_DEBUG_LEVEL, &debug_level) != LDAP_OPT_SUCCESS) {
/* Write error about setting option */
}
希望这有帮助!