TLS 1.2适用于LdapConnection,但不适用DirectoryEntry



我无法使用DirectoryService类通过TLS 1.2连接到活动目录。我能够通过Windows上的LDP, Windows上的开源LDAPAdmin和. net 4.7.2控制台应用程序中的LdapConnection使用TLS 1.2进行连接。我已经用WireShark验证了TLS 1.2连接。下面是一些示例代码:

static void Main(string[] args)
{
LdapConnection conn = new LdapConnection("server.domain.com:636");
var op = conn.SessionOptions;
op.ProtocolVersion = 3;
op.SecureSocketLayer = true;
op.VerifyServerCertificate = (ldapConnection, serverCertificate) =>
{
return true;
};
conn.AuthType = AuthType.Negotiate;
var cred = new NetworkCredential("user@domain.com", "password");
conn.Credential = cred;
conn.Bind(cred);
Console.WriteLine("LdapConnection Success");
// Is not TLS 1.2
var de = new DirectoryEntry("LDAP://server.domain.com", "user@domain.com", "password", AuthenticationTypes.Secure);
try
{
foreach (var child in de.Children)
{
Console.WriteLine(child);
}
Console.WriteLine($"{de.Path} Success");
}
catch (Exception ex)
{
Console.WriteLine($"{de.Path} {ex.Message}");
}
//Does not work
de = new DirectoryEntry("LDAP://server.domain.com:636", "user@domain.com", "password");
try
{
foreach (var child in de.Children)
{
Console.WriteLine(child);
}
Console.WriteLine($"{de.Path} Success");
}
catch (Exception ex)
{
Console.WriteLine($"{de.Path} {ex.Message}");
}
//Does not work
de = new DirectoryEntry("LDAP://server.domain.com", "user@domain.com", "password", AuthenticationTypes.SecureSocketsLayer | AuthenticationTypes.Secure);
try
{
foreach (var child in de.Children)
{
Console.WriteLine(child);
}
Console.WriteLine($"{de.Path} Success");
}
catch (Exception ex)
{
Console.WriteLine($"{de.Path} {ex.Message}");
}
//Does not work
de = new DirectoryEntry("LDAP://server.domain.com:636", "user@domain.com", "password", AuthenticationTypes.SecureSocketsLayer | AuthenticationTypes.Secure);
try
{
foreach (var child in de.Children)
{
Console.WriteLine(child);
}
Console.WriteLine($"{de.Path} Success");
}
catch (Exception ex)
{
Console.WriteLine($"{de.Path} {ex.Message}");
}
Console.ReadKey();
}

任何想法是如何通过DirectoryService类连接?我在StackOverflow中看到了很多关于这个主题的问题,这就是为什么我在示例代码中包含了我读到的所有其他答案。

通过LDAPS与DirectoryEntry连接的正确方法是:

e = new DirectoryEntry("LDAP://server.domain.com:636", "user@domain.com", "password");

您不需要指定AuthenticationTypes.SecureSocketsLayer,因为这是在端口636上连接的唯一可能方式,但是如果您这样做也不会造成任何损害。

我猜你的证书有问题。可能有两个原因之一:

  1. 上的域名证书不匹配您正在使用的域名连接。例如,如果您正在使用域名server.domain.com连接,那么证书必须颁发给(或有一个主题替代名称)server.domain.com。如果证书上的域名只是domain.com,或者只是server,那么它不匹配,它将失败。
  2. 证书不是由客户端计算机信任的机构颁发的。例如,可能是自签名。

它适用于LdapConnection,因为你有这个:

op.VerifyServerCertificate = (ldapConnection, serverCertificate) =>
{
return true;
};

这是验证证书的自定义代码,它总是返回true。因此任何与证书有关的问题将被忽略。DirectoryEntry没有给你这样做的方法。

您可以使用答案中的PowerShell代码下载证书(确保更改域名)并检查它。当你双击。cer文件时,Windows将标记一个问题(如果有的话)。

相关内容

  • 没有找到相关文章

最新更新