You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 15:27:35