首页 文章

无法使用kerberos票证缓存使用apache http client 4.5进行身份验证

提问于
浏览
8

我正在对kerberos认证的REST服务执行https请求 . 如果我使用keytab,一切都很好 . 但是,我要求我应该使用kerberos票证缓存文件,该文件是在使用其密码登录工作站时创建的 .

我将用MY_DOMAINE.COM替换域名

所以,klist显示:

Ticket cache: FILE:/tmp/krb5cc_210007
Default principal: dragomira@MY_DOMAINE.COM

Valid starting     Expires            Service principal
05/15/18 07:21:51  05/15/18 17:21:51  krbtgt/MY_DOMAINE.COM@MY_DOMAINE.COM
        renew until 05/22/18 06:18:22

像这样使用卷曲可以正常工作:

curl -k --negotiate -u :  'my_url' -v

现在,让我们回到代码 . 我的login.conf是这样的:

com.sun.security.jgss.login {
  com.sun.security.auth.module.Krb5LoginModule required
  client=TRUE
  doNotPrompt=true
  useTicketCache=true;
};

com.sun.security.jgss.initiate {
  com.sun.security.auth.module.Krb5LoginModule required
  client=TRUE
  doNotPrompt=true
  useTicketCache=true;
};

com.sun.security.jgss.accept {
  com.sun.security.auth.module.Krb5LoginModule required
  client=TRUE
  doNotPrompt=true
  useTicketCache=true;
};

我的http客户端的相关java代码是针对kerberos的,它是:

try {
    SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (chain, authType) -> true).build();
    HostnameVerifier hostnameVerifier = new NoopHostnameVerifier();
    Registry<AuthSchemeProvider> authSchemeRegistry = RegistryBuilder.<AuthSchemeProvider>create()
            .register(AuthSchemes.SPNEGO, new SPNegoSchemeFactory())
            .build();
    Credentials dummyCredentials = new NullCredentials();
    CredentialsProvider credProv = new BasicCredentialsProvider();
    credProv.setCredentials(new AuthScope(null, -1, null), dummyCredentials);
    this.httpClient = HttpClientBuilder.create()
            .setDefaultAuthSchemeRegistry(authSchemeRegistry)
            .setDefaultCredentialsProvider(credProv)
            .setSSLContext(sslContext)
            .setSSLHostnameVerifier(hostnameVerifier)
            .build();
} catch (NoSuchAlgorithmException | KeyStoreException | KeyManagementException e) {
    throw new RuntimeException(e.getMessage(), e);
}

在此之前,我正在设置这些java proerties:

java.security.auth.login.config=/home/dragomira/kerberos/login.conf
java.security.krb5.conf=/etc/krb5.conf
sun.security.krb5.debug=true
javax.security.auth.useSubjectCredsOnly=false

kerberos日志的输出是:

从Java配置加载

>>>KinitOptions cache name is /tmp/krb5cc_210007
>>>DEBUG <CCacheInputStream>  client principal is dragomira@MY_DOMANIN.COM
>>>DEBUG <CCacheInputStream> server principal is krbtgt/MY_DOMANIN.COM@MY_DOMANIN.COM
>>>DEBUG <CCacheInputStream> key type: 18
>>>DEBUG <CCacheInputStream> auth time: Tue May 15 06:18:22 EDT 2018
>>>DEBUG <CCacheInputStream> start time: Tue May 15 07:21:51 EDT 2018
>>>DEBUG <CCacheInputStream> end time: Tue May 15 17:21:51 EDT 2018
>>>DEBUG <CCacheInputStream> renew_till time: Tue May 22 06:18:22 EDT 2018
>>> CCacheInputStream: readFlags()  FORWARDABLE; RENEWABLE; INITIAL; PRE_AUTH;
>>>DEBUG <CCacheInputStream>  client principal is dragomira@MY_DOMANIN.COM
>>>DEBUG <CCacheInputStream> server principal is HTTP/configuration.prd.int.MY_DOMANIN.COM@MY_DOMANIN.COM
>>>DEBUG <CCacheInputStream> key type: 23
>>>DEBUG <CCacheInputStream> auth time: Tue May 15 06:18:22 EDT 2018
>>>DEBUG <CCacheInputStream> start time: Tue May 15 07:57:49 EDT 2018
>>>DEBUG <CCacheInputStream> end time: Tue May 15 17:21:51 EDT 2018
>>>DEBUG <CCacheInputStream> renew_till time: Tue May 22 06:18:22 EDT 2018
>>> CCacheInputStream: readFlags()  FORWARDABLE; RENEWABLE; PRE_AUTH;
>>> unsupported key type found the default TGT: 18

所以在我看来,票据被读取但是从最后收到401以来没有从中提取凭证 .

我必须为apache http client 4.5做些特别的事情才能使用票证吗?

亲切的问候

3 回答

  • 3

    根据错误: unsupported key type found the default TGT: 18

    类型18 = aes-256-cts-hmac-sha1-96(参见IANA Kerberos Parameters

    我认为你正在使用JRE政策有限的JRE,并且必须设置无限强度的JCE政策 .

    在Oracle JRE的Oracle下载站点上 . 在其他资源下查看JDK / JRE 8的Java密码术扩展(JCE)无限强度管辖权策略文件

    Oracle Java SE downloads

    另见:Oracle Java SE 8 technotes jgss

    注意:JDK中的JCE框架包括对加密算法和应用程序可用的最大加密强度实施限制的能力 . 此类限制在"jurisdiction policy files."中指定 . 捆绑在Java SE中的管辖区策略文件限制了最大密钥长度 . 因此,要使用AES256加密类型,您需要安装带有无限制版本的JCE加密策略,以允许使用256位密钥的AES .

    测试您的政策(source):

    jrunscript -e 'print (javax.crypto.Cipher.getMaxAllowedKeyLength("AES") >= 256);'
    

    截至2018年初,所有受支持版本的Oracle JDK都开始提供默认的无限强度JCE策略:

    https://bugs.openjdk.java.net/browse/JDK-8189377

    另请参阅这些有趣的变通解决方法,以及JRE9的可能覆盖设置:https://stackoverflow.com/a/22492582/2824577

  • 0

    嗯...

    默认负责人:dragomira@MY_DOMAINE.COM

    DEBUG客户负责人是dragomira@MY_DOMANIN.COM

    DOMANIN?

  • 3

    我在 Spring 季启动应用程序中做同样的事情 . 我可以使用缓存票证(users / conf / krb5_xyz)进行休息调用并正确验证 .

    我的工作客户:

    public class Test {
    
        public static void main(String[] args) {
    
    
            Map<String, Object> loginOption = new HashMap<>();
            loginOption.put("refreshKrb5Config","true");
            loginOption.put("useTicketCache", "true");
            loginOption.put("ticketCache","h:/config/krb5cc_xyz");
            loginOption.put("doNotPrompt","true");
            loginOption.put("debug","true");
    
      /* 
    option 1 : using keytab
    
    KerberosRestTemplate restTemplate = new KerberosRestTemplate("C:\\Users\\xyz\\kerberos\\kerberos\\src\\main\\resources\\xyz.keytab", "wdd@sd.sd.sd");*/
    
    /* option 2: using cache */
           KerberosRestTemplate restTemplate = new KerberosRestTemplate(null , "-",loginOption);
            String response = restTemplate.getForObject("http://host:13080/xyz",String.class);
            System.out.println("Result"+response);
    
    
        }
    

相关问题