【问题标题】:starttls successful even after deleting CA from the ca dir即使从 ca 目录中删除 CA,starttls 也会成功
【发布时间】:2014-10-16 21:34:41
【问题描述】:

我无法验证我的软件的正确行为。以下是我正在执行以验证正确操作的步骤:

  1. 我有使用 openldap 库并启动 tls 到 ldap 服务器的示例代码。
  2. 我第一次为 ca cert 目录和 tlx 上下文设置了全局选项。
  3. 之后,我对服务器执行了 ldap int 和 ldap start tls。这正如预期的那样成功。
  4. 我做了一个 ldap_unbind_s
  5. 我从客户端的 ca cert 目录中删除了签署 ldap 服务器证书的 CA 证书。
  6. 又做了 ldap_init 和 ldap_start_tls_s 。
  7. 我预计这个调用会失败,因为我已经删除了 ca 证书。但我观察到的是,服务器发送证书但 start_tls 返回成功。

我正在使用带有 libssl.0.9.8 的 openldap 2.4

LDAP *ld;
int desired_version=3;

if ((ld = ldap_init(<hostname>, <server_port>)) == NULL ) {
    printf("ldap_init failed\n");
    exit(0);
}

ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION, &desired_version);
ldap_set_option(NULL, LDAP_OPT_X_TLS_CTX, NULL);
ldap_set_option(NULL, LDAP_OPT_X_TLS_CACERTDIR,"<ca dir>");

if(ldap_start_tls_s(ld, NULL, NULL) != LDAP_SUCCESS){
    printf("start tls failed.\n");
    exit(0);
}

...
... <do bind and search>
...

ldap_unbind_s(ld);        
...

// DELETE the CA certificate from the ca dir.    
// Try to do start tls again

if ((ld = ldap_init(hostname, server_port)) == NULL ) {
    printf("ldap_init failed , after deleting CA\n");
    exit(0);
}

// This goes fine even after deleting the CA
if (ldap_start_tls_s(ld, NULL, NULL) != LDAP_SUCCESS){
    printf("start tls failed after deleting CA.\n");
    exit(0);
}

【问题讨论】:

  • 证书可能仍加载到 LDAP 服务器的内存中。这是一件很奇怪的事情:目的是什么?
  • @EJP:看起来我的问题并不清楚。我已经从客户端删除了 ca 证书。服务器仍然有自己的证书。我的问题是,在 SSL 握手期间,客户端必须验证服务器的证书。为此,客户端应在其中配置 CA 证书。只有这样才能验证。但是在这种情况下,即使 ca cert 不存在,ssh 握手也很好。这很奇怪。
  • @Soma - 好问题。我总是很高兴看到有人试图破坏他们自己的软件(尤其是当它的高完整性时)。这几乎听起来像是一个坏掉的客户。确保 LDAP 库没有做一些聪明的事情,比如关闭验证,如 The Most Dangerous Code in the World: Validating SSL Certificates in Non-Browser Software
  • @Soma - 另外,请务必尝试加载 CA。正如 EJP 所讨论的,LDAP 软件或 OpenSSL 可能正在缓存已删除的 CA 证书。最简单的判断方法可能是安装一个不相关的 CA。这样,您就知道您有一个可用的 CA 证书并且该 CA 应该失败。去抢Startcom's CA certs之一。
  • @jww - 我尝试不安装 CA 证书并且启动 tls 失败,正如预期的那样。此外,在安装证书并按照我的问题中给出的步骤后,结果如问题中所述。但是如果我重新启动 ldap 客户端,启动 tls 会失败。因此,正如 EJP 所提到的,CA 证书的缓存应该由客户端完成。我将通过您指出的文档,看看我是否遗漏了代码中的某些内容。

标签: openssl ldap certificate openldap ca


【解决方案1】:

您应该重新初始化 TLS 上下文。

int is_server = 0; ldap_set_option(NULL, LDAP_OPT_X_TLS_NEWCTX, &is_server);

【讨论】:

    猜你喜欢
    • 2021-04-01
    • 1970-01-01
    • 2018-01-03
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 2014-12-12
    • 2020-09-05
    相关资源
    最近更新 更多