使用Kerberos票据缓存时Apache HttpClient 4.5认证失败求助
首先,从你提供的Kerberos日志里能揪出关键线索:unsupported key type found the default TGT: 18。这里的密钥类型18对应AES-256-CTS-HMAC-SHA1-96,而Java的GSSAPI默认可能没启用对该加密类型的支持,或者配置里没明确允许,这就是导致票据能读取但无法正常提取凭证、最终返回401的核心原因。
结合你的场景(curl能正常访问但Java客户端不行),可以按以下步骤排查修复:
1. 确保Java支持AES-256加密
如果你的Java版本是8u161及以后,默认已经包含无限制强度的JCE(Java Cryptography Extension)策略文件;要是版本更旧,得手动安装对应的JCE无限制策略包:
- 下载对应Java版本的JCE包
- 将解压后的
local_policy.jar和US_export_policy.jar替换到$JAVA_HOME/jre/lib/security目录下
2. 明确指定Kerberos加密类型
修改krb5.conf文件,在[libdefaults]段添加以下配置,强制使用包含AES-256在内的支持加密类型:
[libdefaults] default_realm = MY_DOMAINE.COM dns_lookup_kdc = true dns_lookup_realm = true default_tkt_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 des3-cbc-sha1 des-cbc-md5 des-cbc-crc default_tgs_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 des3-cbc-sha1 des-cbc-md5 des-cbc-crc permitted_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 des3-cbc-sha1 des-cbc-md5 des-cbc-crc
也可以直接通过Java系统属性指定:
sun.security.krb5.encryption.types=aes256-cts-hmac-sha1-96,aes128-cts-hmac-sha1-96
3. 优化Login.conf配置
你的login.conf里com.sun.security.jgss.accept段设置了client=TRUE,但这个段是给服务端用的,客户端场景下可以简化,避免不必要的配置冲突:
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 useTicketCache=true; };
4. 明确指定票据缓存路径
虽然日志显示已经读取了/tmp/krb5cc_210007,但可以主动指定路径,避免Java自动查找的潜在问题:
在Java系统属性中添加:
sun.security.krb5.ccache=/tmp/krb5cc_210007
或者在LoginModule配置里补充:
com.sun.security.jgss.login { com.sun.security.auth.module.Krb5LoginModule required client=TRUE doNotPrompt=true useTicketCache=true ticketCache="/tmp/krb5cc_210007"; };
最后测试
调整完配置后重启Java应用,再次请求服务。如果日志里不再出现unsupported key type的错误,且能正常获取服务票据,应该就能解决401问题了。
另外注意下你日志里的域名拼写:MY_DOMANIN.COM(少了一个字母E),虽然curl能正常工作,但最好确认krb5.conf和系统域名配置保持一致,避免潜在的解析问题。
内容的提问来源于stack exchange,提问作者adragomir




