【问题标题】:How to connect to a REST service that needs Windows client authentication from Java?如何从 Java 连接到需要 Windows 客户端身份验证的 REST 服务?
【发布时间】:2017-02-15 16:48:26
【问题描述】:

我想从 Java 访问 REST 服务。该服务在 Windows 下运行,并且可能使用“默认”身份验证机制。有人告诉我这是 Kerberos,它回退到 NTLM。我可以使用 Firefox(也可与 HttpRequester 一起使用)通过普通的 HTTPS GET 请求访问该服务 - 无需明确指定任何凭据(显然使用了我的 Windows 帐户)。

如何从 Java 访问服务?使用 java.net.URL 读取的天真尝试失败,状态码为 400。

【问题讨论】:

  • org.apache.httpcomponents:httpclient-win:4.5.3 看起来很有希望。
  • httpclient-win 有效,但我还没有找出原因或方法。
  • 嗨;如果我们已经回答了您的问题,请将其标记为这样,以便向社区中的其他人验证;否则请告诉我们。

标签: java windows rest kerberos ntlmv2


【解决方案1】:

即使是 JDK(Oracle 的 JVM 实现)也提供了这个,你可以看看 https://docs.oracle.com/javase/8/docs/technotes/guides/security/jgss/lab/part6.html

【讨论】:

  • Oracle JVM 可能不是一个选项,因为 OpenJDK 用于客户端。
【解决方案2】:

这提供了解决方案的高级步骤。您需要 Active Directory 才能将 Kerberos 与 Windows 结合使用。然后您将要做的是使用 Java Spring Security for Kerberos 以便从 Java 访问 REST 服务。以下是更具体的步骤。

  1. Java Spring Security for Kerberos 库将为您完成繁重的工作,它提供了一个类来将 Kerberos 配置注入 HTTP 客户端:org.springframework.security.kerberos.client.KerberosRestTemplate

  2. 您在客户端配置 .properties 文件中定义了一些 Kerberos 属性。这是文件中关于 Kerberos 的最重要的 sn-p:

KERBEROS.FLAG=Y
KERBEROS.DEBUG=true
SERVICE_ACCOUNT_PRINCIPAL = HTTP/some.hostname@YOUR.REALM
KEYTAB_LOCATION = file:///C:/path/to/filename.keytab
KDC = server.fqdn.name
KDC_DOMAIN = YOUR.REALM
KRB5 = file:///C:/path/to/krb5.conf

编辑:

Windows AD 加入域的计算机上的 Java 客户端不需要 Kerberos 密钥表。由于您想使用运行 Java 程序的人的凭据,因此您不会使用 keytab(因为 keytab 本身只包含一个凭据)。

Refer to the official Spring Security Website

【讨论】:

  • 嗨@Gustave;我对这个问题进行了重要的编辑,如果它回答了您的问题,请将其标记为这样,以便对其他人有所帮助;否则请告知
  • 您好 T-Heron,抱歉,我只是不明白您的回答。 “杠杆”是什么意思?所有的环境都已经设置好了,我对此几乎没有影响。 httpclient-win 完成了这项工作,没有任何明显的繁重工作,但像往常一样,当某些事情起作用时,找出它为什么这样做的优先级较低。
猜你喜欢
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 2018-01-22
  • 1970-01-01
相关资源
最近更新 更多