繁体   English   中英

如何验证LDAP + SSL连接的服务器SSL证书

[英]How to validate server SSL certificate for LDAP+SSL connection

我们的应用程序适用于Active Directory用户和组。 我们正在端口389上使用LDAP进行Active Directory操作。 现在,我们的一位客户希望我们添加使用LDAP + SSL进行Active Directory通信的选项。

他们告诉我们,他们的域上安装了本地CA,并对LDAPS使用自签名证书。 他们还告诉我们,他们将提供证书,不需要相互信任,我们应该使用Windows证书存储。

我已经开发了一个用于LDAP + SSL操作的测试应用程序,并且看到该服务器在客户端启动LDAP + SSL连接时发送其证书。 我只能通过从服务器证书验证方法返回true来建立连接。

问题是; -客户应该给我们哪个证书(根,用于LDAP + SSL的证书...)?

在.Net环境中工作的证书的格式应该是什么?

连接服务器时应如何验证服务器的证书?

“我们应该使用Windows证书存储区”是什么意思? 他们是否要我们将服务器的证书自动添加到本地计算机的受信任证书存储中?

我用于LDAP + SSL连接的示例代码,

LdapConnection _connection = new LdapConnection(new LdapDirectoryIdentifier(m_DomainName, m_PortNo));
_connection.Timeout = TimeSpan.FromMinutes(10);
_connection.AuthType = AuthType.Basic;
_connection.Credential = new NetworkCredential(m_UserName, m_Password);

_connection.SessionOptions.ProtocolVersion = 3;
_connection.SessionOptions.SecureSocketLayer = true; 

_connection.SessionOptions.VerifyServerCertificate = (ldapCon, serverCertificate) =>
{
   //TODO: Verify server certificate
   return true;
};
_connection.SessionOptions.QueryClientCertificate = (con, trustedCAs) => null;

_connection.Bind();

客户应该给我们哪个证书(根,用于LDAP + SSL的证书...)?

签署LDAP服务器证书的根证书。 他们还可以提前给您整个链,但是无论如何将在TLS握手期间发送。 您只需要事先拥有根证书。

在.Net环境中工作的证书的格式应该是什么?

您可以导入certmgr.msc的所有内容。 Pfx是Windows上的通常选择。

连接服务器时应如何验证服务器的证书?

您不应该自己编写验证。 证书验证是一项艰巨的任务,已经为您完成。 使用内置的东西(另请参见下文)。

“我们应该使用Windows证书存储区”是什么意思? 他们是否要我们将服务器的证书自动添加到本地计算机的受信任证书存储中?

是。 他们向您发送用于签署ldap服务器证书的根证书,然后您可以将其导入为受信任的根。 完成此操作后,您无需进行任何手动验证,它将与有效的证书一起使用:),而不对无效的证书起作用。

请注意,一旦您将其根证书添加为受信任的证书,他们就可以为安装了其根的客户端伪造任何服务器证书,并且他们签名的任何内容都将在该客户端上视为有效。

奖励:添加半定制验证和调试证书错误

您可能面临的一个问题是错误消息不是很有帮助。 如果无法验证证书,您将收到一条非常普通的错误消息,其中没有关于实际问题的提示。 您可能还出于其他原因也想加入验证过程。

为此,您可以定义自己的验证:

private bool VerifyServerCertificate(LdapConnection ldapConnection, X509Certificate certificate)
{
    X509Certificate2 certificate2 = new X509Certificate2( certificate );
    return certificate2.Verify();
}

然后将其添加到ldap连接中:

_connection.SessionOptions.VerifyServerCertificate = 
    new VerifyServerCertificateCallback( VerifyServerCertificate );

这样,您可以在Verify()等上捕获异常。但是,再次说明一下,如果证书有效(可以由客户端验证),则不需要严格执行此操作,它还是会自动完成。 仅当您想要某些未实现的东西时才需要它,例如,您可以在VerifyServerCertificate返回true来接受包括无效证书在内的任何证书(这是一个坏主意 ,会使安全连接无效,但对于调试而言可能是有益的,等等)。

您可以在此方法中实现的另一件事是证书固定,以提高安全性,但这超出了此答案的范围。

顺便说一句:自2000年5月(RFC 2830)引入针对LDAP v3的StartTLS扩展操作以来,不推荐使用LDAPS(为LDAP v2制造)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM