我想从Java访问一个REST服务。该服务在Windows下运行,可能使用“默认”的身份验证机制。有人告诉我它是Kerberos,具备回退到NTLM的能力。我可以通过纯粹的HTTPS GET请求来访问服务,使用Firefox(也可以使用HttpRequester) - 没有明确指定任何凭据(显然使用我的Windows帐户)。
我如何从Java访问该服务?尝试使用java.net.URL读取的天真尝试失败,返回状态码400。
我想从Java访问一个REST服务。该服务在Windows下运行,可能使用“默认”的身份验证机制。有人告诉我它是Kerberos,具备回退到NTLM的能力。我可以通过纯粹的HTTPS GET请求来访问服务,使用Firefox(也可以使用HttpRequester) - 没有明确指定任何凭据(显然使用我的Windows帐户)。
我如何从Java访问该服务?尝试使用java.net.URL读取的天真尝试失败,返回状态码400。
即使JDK(Oracle的JVM实现)也提供了这个功能,您可以查看https://docs.oracle.com/javase/8/docs/technotes/guides/security/jgss/lab/part6.html。
这提供了解决方案的高级步骤。您需要Active Directory才能在Windows上利用Kerberos。然后,您将使用Java Spring Security for Kerberos来访问Java中的REST服务。以下是更具体的步骤。
Java Spring Security for Kerberos库将为您完成繁重的工作,它提供了一个类来将Kerberos配置注入到HTTP客户端中:org.springframework.security.kerberos.client.KerberosRestTemplate
您可以在客户端配置.properties文件中定义一些Kerberos属性。以下是与Kerberos相关的最重要的文件片段:
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 keytabs。由于您想要使用运行Java程序的人的凭据,因此您不会使用keytab(因为keytab本身仅包含一个凭据)。