0

JNDI LDAP 身份验证需要将明文密码(Context.SECURITY_CREDENTIALS)传递给几乎所有的安全机制(或者至少我理解它的方式)。它看起来像是以某种方式设计的,密码来自当前的 JVM。但是,必须从另一台机器发送的密码呢?这种方法迫使它以可恢复的方式(最简单的是明文)发送,几乎没有安全性。

更具体地说,让我们考虑一个 3 层设置:客户端、Java 服务器和 LDAP 服务器。用户在客户端输入用户名和密码,发送到 java 服务器。然后 java 服务器与 LDAP 服务器通信以授权这些凭据。有没有办法使从客户端到 java 服务器的传输安全?我知道,我们可以使用 SSL 或其他方式来保护通道本身,但是我们必须通过这个(甚至是安全的)通道以可恢复的方式发送密码仍然没有好处。

我试图寻找答案,但看起来他们中的大多数人都考虑使用 2 层设置。还有一些 3d 方 java 库推荐(而不是 JNDI),但不清楚它们是否可以处理我的任务。如果他们真的这样做了,你能举个例子来利用它们来完成我的任务吗?

我的目标平台是 Delphi XE3 Client、Java SE 6 Server 和 AD LDAP。但我也对不限于这些具体客户端和 LDAP 的更多理论讨论感兴趣。

4

2 回答 2

1

这种方法迫使它以可恢复的方式(最简单的是明文)发送,几乎没有安全性。

该方法要求您使用 SSL。就这么简单。

于 2013-09-08T23:43:16.000 回答
1

我们找到了答案,并真正让它在生产系统上运行。正确的路径是使用 Kerberos 协议http://en.wikipedia.org/wiki/Kerberos_(protocol)

在我的设置中会发生以下情况:

1)客户端在AD中获取到服务端服务的ticket,发送给服务端。这是通过TSSPIWinNTCredentialsclass in附近的类来完成的Indy,但我认为直接使用 Windows 函数很容易做到这一点。

2) 服务器作为服务登录AD。这是通过LoginContext类使用正确AppConfigurationEntry的键来完成的。

3)服务器使用客户端的ticket对AD中的客户端进行身份验证,获取客户端的用户名。这是通过Subject.doAs类附近的方法和类来完成的GSSManager

4) 服务器执行额外的业务级别检查并授予客户端业务会话。这当然是特定于业务的。

在这种情况下,不会进行任何不安全的通信,包括以可恢复的方式发送密码,因为这是 Kerberos 协议本身的设计目标。

于 2013-11-21T15:47:44.640 回答