【发布时间】:2014-10-16 21:34:41
【问题描述】:
我无法验证我的软件的正确行为。以下是我正在执行以验证正确操作的步骤:
- 我有使用 openldap 库并启动 tls 到 ldap 服务器的示例代码。
- 我第一次为 ca cert 目录和 tlx 上下文设置了全局选项。
- 之后,我对服务器执行了 ldap int 和 ldap start tls。这正如预期的那样成功。
- 我做了一个 ldap_unbind_s
- 我从客户端的 ca cert 目录中删除了签署 ldap 服务器证书的 CA 证书。
- 又做了 ldap_init 和 ldap_start_tls_s 。
- 我预计这个调用会失败,因为我已经删除了 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