Keycloak Kerberos认证报错:RC4 with HMAC加密类型不支持
Keycloak Kerberos认证:RC4-HMAC报错与AES配置方案
为什么会尝试使用RC4-HMAC?
- Windows客户端默认可能优先推送RC4-HMAC的认证票据,只要AD中对应的用户/服务账户未禁用RC4加密类型,或者客户端Kerberos配置未强制优先AES,就会出现这种情况。
- 即便你的keytab支持AES256,Keycloak底层的Java Kerberos实现会尝试匹配客户端发送的所有加密类型;如果客户端先发送RC4请求,而Keycloak默认已禁用这类弱加密,就会触发该报错。
配置Keycloak使用AES加密的步骤
1. 确保AD服务账户启用AES加密
- 在Windows AD中找到Keycloak对应的服务账户,打开属性→账户标签,勾选使用Kerberos AES 256位加密(按需可同时勾选AES 128),保存设置。
- 重新生成keytab,避免用
/crypto all,直接指定AES加密类型:ktpass /princ HTTP/keycloak.example.com@EXAMPLE.COM /mapuser KEYCLOAK_SERVICE_ACCOUNT@EXAMPLE.COM /pass * /out keycloak.keytab /crypto AES256-SHA1 /ptype KRB5_NT_PRINCIPAL /mapop set
2. 调整Keycloak领域的Kerberos配置
- 登录Keycloak管理控制台,进入目标领域→身份提供者→选中你的Kerberos/SPNEGO提供者:
- 确认
Kerberos Keystore Path指向新生成的AES keytab文件。 - 在高级设置中,将
Allowed Encryption Types设为aes256-cts-hmac-sha1-96,aes128-cts-hmac-sha1-96(仅保留AES类型)。 - 核对
Kerberos Principal与AD中配置的SPN完全一致(如HTTP/keycloak.example.com@EXAMPLE.COM)。
- 确认
3. 配置Docker环境的Java Kerberos参数
Keycloak运行在Java环境中,需强制其使用AES并禁用RC4,通过Docker启动参数实现:
- 添加JVM参数:
-e JAVA_OPTS="-Djava.security.krb5.conf=/opt/keycloak/conf/krb5.conf -Dsun.security.krb5.encryption.types=aes256-cts-hmac-sha1-96,aes128-cts-hmac-sha1-96" - 准备
krb5.conf文件,确保加密类型仅包含AES:[libdefaults] default_realm = EXAMPLE.COM dns_lookup_kdc = true dns_lookup_realm = true default_tkt_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 default_tgs_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 permitted_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 - 将该文件挂载到Docker容器内的
/opt/keycloak/conf/路径下。
4. 强制Windows客户端优先使用AES
- 通过组策略:进入计算机配置→管理模板→系统→Kerberos→加密类型配置,启用策略并仅勾选
AES256_HMAC_SHA1和AES128_HMAC_SHA1,禁用所有RC4相关选项。 - 或通过注册表:在
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Kerberos\Parameters下添加SupportedEncryptionTypesDWORD值,设为0xC0000000(同时支持AES256和AES128)。
验证配置
- 重启Keycloak容器,在Windows客户端执行
klist purge清除旧票据。 - 重新尝试登录,查看Keycloak日志,确认无RC4相关报错,且认证流程使用AES加密类型。
内容的提问来源于stack exchange,提问作者Martin Fischer
相关产品推荐
相关产品推荐

