You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Kerberos票据缓存时Apache HttpClient 4.5认证失败求助

解决Apache HttpClient 4.5使用Kerberos票据缓存返回401的问题

首先,从你提供的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.jarUS_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.confcom.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

火山引擎 最新活动