Openssl 即使从CA目录中删除CA,starttls也会成功

Openssl 即使从CA目录中删除CA,starttls也会成功,openssl,ldap,certificate,openldap,ca,Openssl,Ldap,Certificate,Openldap,Ca,我无法验证软件的正确行为。以下是我为验证操作是否正确而执行的步骤: 我有使用openldap库并对ldap服务器执行启动tls的示例代码 我第一次为ca证书目录和tlx上下文设置了全局选项 之后,我对服务器执行了ldap int和ldap启动tls。正如所料,这是成功的 我做了一个ldap解绑 我从客户端的CA证书目录中删除了签署ldap服务器证书的CA证书 ldap_init和ldap_start_tls再次启动 我预计这个调用会失败,因为我已经删除了ca证书。但我观察到的是,服务器发送了证书

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

  • 我有使用openldap库并对ldap服务器执行启动tls的示例代码
  • 我第一次为ca证书目录和tlx上下文设置了全局选项
  • 之后,我对服务器执行了ldap int和ldap启动tls。正如所料,这是成功的
  • 我做了一个ldap解绑
  • 我从客户端的CA证书目录中删除了签署ldap服务器证书的CA证书
  • ldap_init和ldap_start_tls再次启动
  • 我预计这个调用会失败,因为我已经删除了ca证书。但我观察到的是,服务器发送了证书,但start_tls返回了成功
  • 我正在使用openldap 2.4和libssl.0.9.8

    LDAP*ld;
    int所需版本=3;
    if((ld=ldap_init(,)==NULL){
    printf(“ldap_init失败\n”);
    出口(0);
    }
    ldap_设置_选项(ld、ldap_选项_协议_版本和所需_版本);
    ldap_set_选项(NULL,ldap_OPT_X_TLS_CTX,NULL);
    ldap_set_选项(NULL,ldap_OPT_X_TLS_CACERTDIR,“”);
    if(ldap\u start\u tls\s(ld,NULL,NULL)!=ldap\u SUCCESS){
    printf(“启动tls失败。\n”);
    出口(0);
    }
    ...
    ... 
    ...
    ldap解除绑定(ld);
    ...
    //从CA目录中删除CA证书。
    //尝试重新启动tls
    if((ld=ldap\u init(主机名、服务器\u端口))==NULL){
    printf(“ldap_init失败,在删除CA\n之后”);
    出口(0);
    }
    //即使在删除CA之后,这也很正常
    if(ldap\u start\u tls\s(ld,NULL,NULL)!=ldap\u SUCCESS){
    printf(“删除CA后启动tls失败。\n”);
    出口(0);
    }
    
    您应该重新初始化TLS上下文


    int是_server=0;ldap_set_选项(NULL、ldap_OPT_X_TLS_NEWCTX和is_服务器)

    证书可能仍然加载到LDAP服务器的内存中。这是一件非常奇怪的事情:目的是什么?@EJP:看来我的问题不清楚。我已从客户端删除ca证书。服务器仍然有自己的证书。我的问题是,在SSL握手期间,客户端必须验证服务器的证书。为此,客户端应该在其中配置CA证书。只有这样,它才能验证。但在这种情况下,即使ca证书不存在,ssh握手也可以。这很奇怪。@Soma-问得好。我总是很高兴看到有人试图破坏他们自己的软件(特别是当它的高度完整性时)。这听起来像是一个破碎的客户。确保LDAP库没有做一些聪明的事情,比如关闭验证,如中所示。@Soma-另外,确保在不加载CA的情况下尝试它。正如EJP所讨论的,LDAP软件或OpenSSL可能正在缓存删除的CA证书。最简单的方法可能是安装一个不相关的CA。这样,您就知道您有一个CA证书可用,并且该CA应该失败。去抓取其中一个。@jww-我在没有安装CA证书的情况下尝试了,但启动tls失败,正如预期的那样。另外,在安装证书并遵循我的问题中给出的步骤后,结果如问题中所述。但是如果我重新启动ldap客户端,启动tls就会失败。因此,正如EJP提到的,CA证书的缓存应该由客户端完成。我将仔细阅读您指出的文档,看看是否遗漏了代码中的某些内容。