我正在编写一个工具,在端口636上建立LDAPS连接到不同的目录服务。使用c#class的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(搜索操作抛出An Operation Error Occurred
),但我能够连接到端口636上的其他目录服务。我偶然删除了
SessionOptions.QueryClientCertificate = new QueryClientCertificateCallback(ClientCertFinder);
现在该程序正在连接所有目录服务,包括端口636上的AD。
这清楚地表明我不理解QueryClientCertificate的使用。有人可以解释一下,为什么要使用它?
答案 0 :(得分:0)
使用安全的LDAP连接(LDAPS)连接到LDAP服务器时,通常会串联使用这两种方法:
QueryClientCertificate
- 从根证书颁发机构的字节数组中检索证书VerifyServerCertificate
- 验证证书是否已发送给您正在连接的第三方通过删除该行代码,您所做的只是绕过客户端证书的检索,这也意味着您绕过了对根CA的验证。但是,正如您可能已经意识到的那样,为了仍然正确建立连接,您需要执行SSL握手,并将SecureSocketLayer
标志设置为true
。可以使用只返回true的委托来强制实际验证:
ldapConnection.SessionOptions.SecureSocketLayer = SSL;
ldapConnection.SessionOptions.VerifyServerCertificate += delegate { return true; };
请记住,这不是您一直想做的事情,特别是如果安全性成为一个问题。存储在目录服务器中的用户信息非常敏感,因此很容易理解为什么存在这些信息。但是,如果您要连接的服务器正在发出自签名证书(因为谁想要支付真实的证书?),那么此过程是必须的,因为自签名证书对于root用户无效CA
答案 1 :(得分:0)
如果要使用客户端证书(例如,在智能卡上)对LDAP服务器进行身份验证,则使用QueryClientCertificate回调。如果您只想使用凭据(例如用户名和密码),则无需这样做。