我们已经实现了Kerberos java客户端,它运行正常。但是,当kerberos票证到期时,Java客户端应用程序在控制台中要求输入用户名,这又会使应用程序挂起。在像SoapUI这样的工具中,我们观察到当Kerberos票证到期时系统抛出Unauthorized错误。我们希望实现类似的行为,即如果Kerberos票证到期,则应抛出未授权的错误,而不是等待用户输入凭据。请帮忙。
为Kerberos测试设置客户端系统 第1步:向Windows注册表添加密钥: 项目价值 key hkey_local_machine \ system \ currentcontrolset \ control \ lsa \ kerberos 值名称allowtgtsessionkey 值类型reg_dword 值0x01
步骤2:在ClientKerberosAuthentication.java主类中添加java系统属性: System.setProperty(" javax.security.auth.useSubjectCredsOnly""假&#34);
第3步:获取票证授予票证(tgt): 运行kinit实用程序以获取票证授予票证。你可以在/ jre / bin目录中找到这个实用程序。 例如:C:\ Program Files \ Java \ jdk1.7.0_79 \ bin \ kinit spnuser7 密码:test @ 123
ClientKerberosAuthentication.java
public class ClientKerberosAuthentication {
public static Credentials getCredentials() {
return new NTCredentials("", "", "desktop.test.com", "test.com");
}
public static void main(String[] args) throws Exception {
System.setProperty("sun.security.krb5.debug", "true");
System.setProperty("javax.security.auth.useSubjectCredsOnly","false");
DefaultHttpClient httpclient = new DefaultHttpClient();
try {
httpclient.getAuthSchemes().register(AuthPolicy.SPNEGO, new SPNegoSchemeFactory());
Credentials use_jaas_creds = getCredentials();
httpclient.getCredentialsProvider().setCredentials(
new AuthScope(null, -1, null),
use_jaas_creds);
HttpUriRequest request = new HttpGet("http://kerbserver7.com/kerbservice/Service1.svc?wsdl");
HttpResponse response = httpclient.execute(request);
HttpEntity entity = response.getEntity();
System.out.println("----------------------------------------");
System.out.println(response.getStatusLine());
System.out.println("----------------------------------------");
if (entity != null) {
System.out.println(EntityUtils.toString(entity));
}
System.out.println("----------------------------------------");
EntityUtils.consume(entity);
} finally {
httpclient.getConnectionManager().shutdown();
}
}
}
答案 0 :(得分:3)
我认为问题是缺少jaas配置文件。应该有java.security.auth.login.config
的设置。如果没有定义的jaas.conf文件,doNotPompt
设置为false(表示它将提示)。这符合OP对提示的观察中描述的行为。
解决方案是创建一个jaas配置文件,并使用上述属性指定所述文件。在所述jaas.conf文件中,设置doNotPrompt=true
。
示例:
com.sun.security.jgss.krb5.initiate {
com.sun.security.auth.module.Krb5LoginModule required
refreshKrb5Config=true
useTicketCache=true
renewTGT=true
doNotPrompt=true
useKeyTab=false
storeKey=true
debug=true
;
};
主要讨论在Krb5LoginModule
的JavaDocs中此处还有一些其他信息:http://cr.openjdk.java.net/~weijun/special/krb5winguide-2/raw_files/new/kwin