【问题标题】:Error testing connection to multiple LDAP servers测试与多个 LDAP 服务器的连接时出错
【发布时间】:2020-03-03 10:07:09
【问题描述】:

我正在开发一个需要连接到 Active Directory 服务器 (LDAP) 以验证某些用户的 Java Web 应用程序。它工作正常,但我正在尝试将其配置为能够连接到 2 个不同的服务器。所以我把这个语法放在我的属性中:

env.put(Context.PROVIDER_URL, 
        "LDAP://" + ParametrosManager.readParametro("LDAP_PROVIDER_URL") + ":636 " +
        "LDAP://" + ParametrosManager.readParametro("LDAP_PROVIDER_URL2") + ":636" 
        );
System.out.println(env.get(Context.PROVIDER_URL));
// it prints LDAP://psfjfhsj.com.br:636 LDAP://myRealLdap.com.br:636

就是这样,两个空格分隔的 ldap URL。第一个不是真实地址,第二个是我的 ldap 服务器之一。但是我的连接尝试失败了,因为我的应用程序找不到第一台服务器!这是一些控制台输出:

javax.naming.CommunicationException: psfjfhsj.com.br:636 [Root exception is java.net.UnknownHostException: psfjfhsj.com.br]
 at com.sun.jndi.ldap.Connection.<init>(Connection.java:226)
 (...)
Caused by: java.net.UnknownHostException: psfjfhsj.com.br

我正在调试 ssl 连接(在我的服务器中使用 -Djavax.net.debug=ssl 标志),我可以看到我的真实主机 (myRealLdap.com.br) 连接并握手正常。假网址当然是找不到的,但这不就是“服务器宕机”的真实模拟吗?

我正在使用带有openjdk 1.8.0_242wildfly 9.0.2 服务器。

谢谢

【问题讨论】:

  • 更有可能导致目标主机无法访问或连接被拒绝。您确定这是列出多个服务器的正确方法吗?
  • 我也觉得这很有趣,但这似乎是正确的方法。以下是一些表明它的链接:stackoverflow.com/questions/14459280/…docs.oracle.com/javase/jndi/tutorial/ldap/misc/url.html
  • 您是否尝试使用以下命令? // 创建初始上下文 DirContext ctx = new InitialDirContext(env); // 查看使用了哪个服务器 System.out.println(ctx.getEnvironment().get(Context.PROVIDER_URL));?
  • 如果我使用realHost1.com realHost2.com,打印出来的只是第一个的地址。如果我使用fakeHost.com realHost2.com,它只打印真实主机的 URL,尽管它是列表中的第二个 URL,并给我 CommunicationException。
  • 我猜这是一个 openjdk 问题(可能没有实现?)。我在 openjdk 文档中找不到对这个多 URL 选项的任何引用。您可以尝试使用 oracle 更改 JDK,因为根据 @BrunoLamps 发布的链接有支持吗?

标签: java active-directory ldap wildfly


【解决方案1】:

根据Oracle,你实现的代码应该支持这个:

除了一个 URL,您还可以提供一个以空格分隔的列表 网址。在这种情况下,LDAP 提供程序将尝试使用每个 URL 转,直到它能够创建成功的连接。 LDAP 然后提供者将 Context.PROVIDER_URL 属性设置为 成功的 URL,以便应用程序可以确定哪个 URL 正在使用。

根据您的堆栈跟踪,我们有 UnknownHostException 并且在 documentation 中声明它被抛出以指示无法确定主机的 IP 地址。基本上这个错误是由于 DNS 未命中而引发的。

在 Internet 上进行深入研究后,我发现其他人的问题与您的问题非常接近(在 LDAP 连接期间出现同样的错误(hereherehere)。 所有这些问题都通过更新 DNS 以包含未知的主机名得到解决。

这就引出了我对 Oracle 文档的解释。 当他们说,LDAP 提供程序将依次尝试使用每个 URL,直到它能够创建成功的连接,他们的意思是连接可能被拒绝,因为服务器已关闭,而不是因为它没有存在。

【讨论】:

  • 最后一分钟的想法:您可以检查是否支持 IP 而不是主机名,这样您就可以跳过我猜的 DNS 问题
  • 我将使用现有但离线的网络主机对其进行测试,谢谢@rakwaht!
  • 嗨,我刚刚尝试了一个存在的主机,它已在我们的 dns 中注册,但已关闭。我得到了一个'javax.naming.CommunicationException: xxxxxxx.xxx.xx.gov.br:636 [根异常是 java.net.NoRouteToHostException: No route to host (Host unreachable)]`。不幸的是,它没有用。
  • 但是错误改变了,所以我想你可以继续挖掘
猜你喜欢
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2013-03-26
  • 2016-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多