C# LDAPConnector类中的QueryClientCertificate做什么?

C# LDAPConnector类中的QueryClientCertificate做什么?,c#,.net,active-directory,ldap,C#,.net,Active Directory,Ldap,我正在编写一个工具,以便在端口636上与不同的目录服务建立LDAPS连接。使用c类的LDAPConnection,我现在能够成功地连接到389和636端口上的AD服务器 但是,我不明白的是,正如我之前读到的,我添加了以下代码来禁用客户端证书验证: public X509Certificate ClientCertFinder(LdapConnection connection,byte[][] trustedCAs) { return null; } if (sslEn

我正在编写一个工具,以便在端口636上与不同的目录服务建立LDAPS连接。使用c类的LDAPConnection,我现在能够成功地连接到389和636端口上的AD服务器

但是,我不明白的是,正如我之前读到的,我添加了以下代码来禁用客户端证书验证:

public X509Certificate ClientCertFinder(LdapConnection connection,byte[][] trustedCAs) {
        return null;
    }

if (sslEnabled){
        ldapConnection.SessionOptions.SecureSocketLayer = sslEnabled;
        SessionOptions.QueryClientCertificate = new QueryClientCertificateCallback(ClientCertFinder);
    }
使用上述代码,我无法连接到端口636上的Active Directory(搜索操作抛出
发生操作错误
),但我可以连接到端口636上的其他目录服务。只是碰巧我搬走了

SessionOptions.QueryClientCertificate = new QueryClientCertificateCallback(ClientCertFinder);
现在该程序正在连接所有目录服务,包括636端口上的AD


这清楚地表明我不理解QueryClientCertificate的用法。请解释一下为什么使用此方法?

当使用安全LDAP连接(LDAPS)连接到LDAP服务器时,通常会同时使用以下两种方法:

  • QueryClientCertificate
    -从根证书颁发机构的字节数组中检索证书
  • VerifyServerCertificate
    -验证证书已颁发给您连接的第三方
  • 通过删除该行代码,您所做的只是绕过对客户端证书的检索,这也意味着您绕过了对根CA的验证。但是,正如您可能已经意识到的,为了仍然正确建立连接,您需要执行SSL握手,并将
    SecureSocketLayer
    标志设置为
    true
    。可以使用仅返回true的委托强制执行实际验证:

    ldapConnection.SessionOptions.SecureSocketLayer = SSL;
    ldapConnection.SessionOptions.VerifyServerCertificate += delegate { return true; };
    

    但请记住,这并不是您一直想要做的事情,尤其是当安全成为一个问题时。目录服务器中可能存储着极其敏感的用户信息,因此很容易理解这些信息存在的原因。但是,如果您连接的服务器正在颁发自签名证书(因为谁想为真正的证书付费?),则必须执行此过程,因为自签名证书对于根CA无效。

    如果您想使用客户端证书(例如,在智能卡上),则使用QueryClientCertificate回调要向LDAP服务器进行身份验证。如果您只是想使用凭据(例如用户名和密码),则无需这样做

    谢谢你的解释。正如您所说,我意识到了“VerifyServerCertificate”属性的使用。但是我还是不明白,为什么删除对“QueryClientCertificate”的委派会使连接通过。嘿,谢谢。这就是我所认为的用途,因此我从委托函数返回null。但当我返回null时,我无法通过LDAPS连接到AD,并抛出异常“发生操作错误”。当我取消委派任务时,这种联系就结束了。现在我想知道,当我不委托时,在这次回调中会发生什么。我敢猜测,这根本不是在尝试客户端证书身份验证