我有一个应用程序使用典型的System.DirectoryServices.DirectoryEntry代码从目录服务复制数据。现在,我需要使用带有自签名证书的SSL从Novell eDirectory复制。我怀疑现有代码将与可以验证的有效证书一起使用,或者是否将自签名证书添加到本地计算 secret 钥库中。为了使它与自签名证书一起正常工作,我能找到的唯一解决方案是使用System.DirectoryServices.Protocols命名空间和LdapConnection类,从而可以连接VerifyServerCertificate回调。我找不到将相同概念应用于DirectoryEntry实例或与LdapConnection实例连接以及以某种方式将其“转换”为DirectoryEntry实例的任何方法。也许不可能,我只是想确认一下。任何其他想法都欢迎。
我找到的唯一相关链接是:http://www.codeproject.com/Articles/19097/eDirectory-Authentication-using-LdapConnection-and
最佳答案
这是一个了不起的问题。
我已经在同一个问题上进行了几天的斗争,并且我终于有了一些确定的证据来证明DirectoryEntry对象在这种情况下不起作用。
该特定的Ldap服务器(在LDAPS 636上运行)还颁发自己的自签名证书。使用LdapConnection(并通过Wireshark监视流量),我注意到使用DirectoryEntry时不会发生握手:
第一个序列来自 protected ldap服务器,第二个序列来自我的机器。提示第二个序列的代码是:
ldapConnection.SessionOptions.VerifyServerCertificate += delegate { return true; };
还有其他方法可以“伪造”回调,但这是我一直在使用的方法。
不幸的是,DirectoryEntry没有选项或方法来验证自签名证书,因此永不发生对证书的接受(第二序列),并且连接无法初始化。
唯一可行的方法是将LdapConnection与SearchRequest和SearchResponse结合使用。到目前为止,这是我得到的:
LdapConnection ldapConnection = new LdapConnection("xxx.xxx.xxx:636");
var networkCredential = new NetworkCredential("Hey", "There", "Guy");
ldapConnection.SessionOptions.SecureSocketLayer = true;
ldapConnection.SessionOptions.VerifyServerCertificate += delegate { return true; };
ldapConnection.AuthType = AuthType.Negotiate;
ldapConnection.Bind(networkCredential);
SearchRequest request = new SearchRequest("DC=xxx,DC=xxx,DC=xxx", "(sAMAccountName=3074861)", SearchScope.Subtree);
SearchResponse response = (SearchResponse)ldapConnection.SendRequest(request);
if(response.Entries.Count == 1)
{SearchResultEntry entry = response.Entries[0];
string DN = entry.DistinguishedName;}
从那里,您可以从SearchResponse收集AD属性,并进行相应的处理。但是,这简直太可惜了,因为SearchRequest似乎比使用DirectoryEntry慢得多。
希望这可以帮助!
关于ssl - 设置System.DirectoryServices.DirectoryEntry的回调以处理自签名SSL证书?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12911391/