使用OpenLDAP时如何从OpenSSL错误中获取更详细的错误信息?

时间:2016-01-25 12:16:29

标签: openssl ldap openldap

我有一些使用社区版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 *,但不知道我能用它做什么。

1 个答案:

答案 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 */
  }

希望这有帮助!