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

Kerberos SPNEGO SSO配置异常:访问应用时出现AES-256解密失败错误

解决Kerberos SSO中"Unable to decrypt AES-256"错误

问题场景

我开发了一款基于Java 17 Spring Boot的内部应用,采用Kerberos和SPNEGO实现SSO验证,同时提供SSO登录与常规登录页面,当SSO验证失败时用户可通过凭据登录。当前环境配置如下:

AD: Azure AD
KDC: Multiple (Local)
Application Host Server: Azure cloud
Application Server: Tomcat 10.1

已完成的配置:

  • 在Azure AD中创建具备管理员权限的专用用户
  • 为该用户及计算机启用AES-256、AES-128、RC-HMAC等加密类型
  • 生成包含相同加密类型的keytab文件
  • 完成Tomcat凭据配置以及krb5.ini和jaas.conf.ini文件的设置

但访问应用时仍持续遇到**"Unable to decrypt AES-256"**错误。


排查方向与解决方案

1. 确认JVM AES-256支持

Java 17默认已包含AES-256支持,但仍需验证环境配置:

  • 检查JRE/lib/security目录下的java.security文件,确认crypto.policy设置为unlimited(默认值)
  • 若存在限制,添加JVM启动参数:-Dcrypto.policy=unlimited(Java 17中该参数已废弃,但部分特殊环境仍需配置)

2. 验证keytab文件有效性

  • 使用klist -k -t /path/to/your.keytab(Linux)或对应Windows工具查看keytab中的加密类型,确认aes256-cts-hmac-sha1-96存在且绑定正确的SPN
  • 重新生成keytab时明确指定加密类型,避免默认生成遗漏:
    ktpass /out app.keytab /princ HTTP/your-app-hostname@YOUR.REALM /mapuser ad-service-user@YOUR.REALM /pass * /crypto AES256-SHA1 AES128-SHA1 RC4-HMAC-NT /ptype KRB5_NT_PRINCIPAL
    
    注意:确保使用的ktpass版本与Azure AD兼容,支持指定的加密类型

3. 调整krb5.ini加密顺序

在krb5.ini的[libdefaults]段中,将AES-256设为优先加密类型:

[libdefaults]
  default_realm = YOUR.REALM
  dns_lookup_kdc = true
  dns_lookup_realm = true
  ticket_lifetime = 24h
  renew_lifetime = 7d
  forwardable = true
  default_tgs_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 rc4-hmac
  default_tkt_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 rc4-hmac
  permitted_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 rc4-hmac

4. 检查Spring Boot与Tomcat的SPNEGO配置

  • Spring Boot中确保SPNEGO过滤器绑定正确的principal和keytab路径:
    @Bean
    public SpnegoAuthenticationFilter spnegoAuthenticationFilter() {
        SpnegoAuthenticationFilter filter = new SpnegoAuthenticationFilter();
        filter.setAuthenticationManager(authenticationManager());
        filter.setPrincipal("HTTP/your-app-hostname@YOUR.REALM");
        filter.setKeytabLocation("classpath:app.keytab");
        return filter;
    }
    
  • Tomcat的context.xml中确认JAAS配置引用正确:
    <Resource name="jaas/SpnegoLoginConfig"
              auth="Container"
              type="javax.security.auth.login.Configuration"
              factory="org.apache.catalina.realm.JAASMemoryLoginConfigFactory"
              userClassNames="org.apache.catalina.realm.GenericPrincipal"
              configFile="conf/jaas.conf.ini"/>
    

5. 验证Azure AD用户的SPN绑定

  • 使用Azure AD PowerShell命令确认服务用户的SPN注册状态:
    Get-AzADServicePrincipal -DisplayName "ad-service-user" | Select-Object -ExpandProperty ServicePrincipalNames
    
  • 确保HTTP/your-app-hostname@YOUR.REALM未被其他AD对象占用

6. 检查多KDC的加密策略一致性

  • 确保所有本地KDC均启用AES-256加密,并将其加入允许的加密类型列表
  • 使用klist命令查看客户端获取的票据,确认KDC返回的票据包含AES-256类型

内容的提问来源于stack exchange,提问作者Bhuvi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 13:27:04