Java 17禁用allow_weak_crypto时启用RC4 HMAC恢复Spring应用SSO
解决Java 17升级后Kerberos SSO因RC4禁用失效的问题
你遇到的核心问题是Kerberos服务端(AD/KDC)仍在使用RC4生成票据,而Java 17默认已禁用这类弱加密算法。仅修改客户端krb5.conf的加密列表没用,必须从服务端到客户端全链路切换到强加密类型,具体步骤如下:
1. 升级Kerberos服务端(AD/KDC)的加密配置
针对Active Directory:
- 打开组策略管理,导航到
计算机配置 > 策略 > Windows设置 > 安全设置 > 账户策略 > Kerberos策略 - 编辑
Kerberos支持的加密类型,只勾选AES256-CTS-HMAC-SHA1-96和AES128-CTS-HMAC-SHA1-96,取消所有RC4、DES相关选项 - 执行
gpupdate /force强制刷新组策略
针对MIT Kerberos等开源KDC:
- 修改KDC配置文件(通常为
kdc.conf),禁用弱加密并设置默认加密类型为AES系列:[kdcdefaults] 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 [realms] YOUR_REALM.COM = { kdc = your-kdc-hostname default_domain = your-domain.com default_principal_flags = +preauth -allow_weak_crypto } - 重启KDC服务,然后重新生成服务主体的keytab文件(确保只包含AES密钥):
kadmin.local -q "ktadd -k /path/to/your-service.keytab -e aes256-cts-hmac-sha1-96,aes128-cts-hmac-sha1-96 HTTP/your-service-hostname@YOUR_REALM.COM"
2. 修正客户端krb5.conf配置
不要混合弱加密类型,直接只保留支持的强加密算法,避免客户端尝试协商RC4:
[libdefaults] default_realm = YOUR_REALM.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
3. 调整Spring应用配置
- 替换应用中使用的keytab文件为刚重新生成的、仅包含AES密钥的版本
- 可选:在Spring Security Kerberos配置中明确指定加密类型,避免协商歧义(同时开启调试便于验证):
@Bean public KerberosAuthenticationProvider kerberosAuthenticationProvider() { KerberosAuthenticationProvider provider = new KerberosAuthenticationProvider(); provider.setUserDetailsService(customUserDetailsService()); provider.setKerberosAuthentication(sunJaasKerberosAuthentication()); return provider; } @Bean public SunJaasKerberosAuthentication sunJaasKerberosAuthentication() { SunJaasKerberosAuthentication auth = new SunJaasKerberosAuthentication(); auth.setServicePrincipal("HTTP/your-service-hostname@YOUR_REALM.COM"); auth.setKeyTabLocation(new ClassPathResource("your-service.keytab")); auth.setDebug(true); // 开启调试可查看加密协商过程 return auth; }
4. 验证加密协商结果
添加JVM参数开启Kerberos调试:
-Dsun.security.krb5.debug=true
查看应用日志,确认出现类似Encryption type used: aes256-cts-hmac-sha1-96的日志,说明已成功使用强加密协商。
内容的提问来源于stack exchange,提问作者user8373873
相关产品推荐
相关产品推荐

