繁体   English   中英

当Kerberos票证过期时Java客户端挂起

[英]Java client hangs when kerberos ticket expires

我们已经实现了Kerberos Java客户端,并且可以正常工作。 但是,当kerberos票证到期时,Java客户端应用程序正在控制台中要求用户名,这反过来又使应用程序挂起。 在SoapUI之类的工具中,我们观察到Kerberos票证过期时系统会引发未经授权的错误。 我们想要实现类似的行为,即如果Kerberos票证过期,则应引发未授权错误,而不是等待用户输入凭据。 请帮忙。

设置客户端系统以进行Kerberos测试步骤1:将密钥添加到Windows注册表:项目值密钥hkey_local_machine \\ system \\ currentcontrolset \\ control \\ lsa \\ kerberos值名称allowtgtsessionkey值类型reg_dword值0x01

步骤2:在ClientKerberosAuthentication.java主类中添加一个Java系统属性:System.setProperty(“ javax.security.auth.useSubjectCredsOnly”,“ false”);

步骤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();
    }
  }
}

我相信问题是缺少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
  ;
};

主要讨论在JavaDocs的Krb5LoginModule中

这里有一些其他信息: http : //cr.openjdk.java.net/~weijun/special/krb5winguide-2/raw_files/new/kwin

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM