Kerberos票据未续订求助:JBoss EAP连接MSSQL超时故障
解决JBoss EAP 6.4中Kerberos票据过期后未自动刷新的问题
这是个很典型的Kerberos票据生命周期与JBoss连接池、安全域配置联动的问题,我来帮你拆解核心原因和解决办法:
核心原因分析
你的应用能正常运行10小时刚好对应AD的TGT票据生命周期,说明初始Kerberos认证是正常的,但票据过期后没有触发重新获取,主要是以下几个配置缺失导致的:
- KerberosLoginModule未开启票据续期或依赖本地缓存:默认情况下,如果LoginModule依赖本地票据缓存,或者没配置自动续期参数,票据过期后不会主动用keytab重新获取新票据。
- 连接池未配置连接有效性验证:JBoss连接池里的旧连接持有过期票据,如果没有定期验证和回收机制,应用会一直复用这些无效连接,不会触发新的认证流程。
具体配置调整步骤
1. 修正Kerberos安全域配置
打开你的standalone.xml或domain.xml,找到对应的安全域配置,确保KerberosLoginModule包含以下关键参数:
<security-domain name="KerberosSecurityDomain" cache-type="default"> <authentication> <login-module code="com.sun.security.auth.module.KerberosLoginModule" flag="required"> <module-option name="useKeyTab" value="true"/> <!-- 必须开启,让LoginModule存储密钥以便后续重新认证 --> <module-option name="storeKey" value="true"/> <module-option name="keyTab" value="/opt/jboss/keytabs/your-service.keytab"/> <module-option name="principal" value="your-service-account@YOUR-AD-REALM.COM"/> <!-- 自动刷新krb5.conf配置,避免缓存旧的域信息 --> <module-option name="refreshKrb5Config" value="true"/> <!-- 开启TGT自动续期,避免票据到期直接失效 --> <module-option name="renewTGT" value="true"/> <!-- 禁用本地票据缓存,强制每次通过keytab获取新票据 --> <module-option name="useTicketCache" value="false"/> </login-module> </authentication> </security-domain>
2. 配置连接池的连接验证机制
调整MSSQL数据源的连接池配置,确保过期的连接会被及时检测并替换,触发新的Kerberos认证:
<datasource jndi-name="java:jboss/datasources/MSSQLKerberosDS" pool-name="MSSQLKerberosDS" enabled="true"> <connection-url>jdbc:sqlserver://mssql-host:1433;databaseName=your-db;integratedSecurity=true;authenticationScheme=JavaKerberos</connection-url> <driver>sqlserver</driver> <security> <security-domain>KerberosSecurityDomain</security-domain> </security> <pool> <min-pool-size>5</min-pool-size> <max-pool-size>20</max-pool-size> <!-- 每次获取连接时验证有效性 --> <validate-on-match>true</validate-on-match> <!-- 后台定期验证连接 --> <background-validation>true</background-validation> <!-- 每1小时验证一次,小于AD的10小时生命周期 --> <background-validation-millis>3600000</background-validation-millis> <!-- 使用MSSQL专属的连接验证器 --> <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLValidConnectionChecker"/> <!-- 正确识别MSSQL的异常,标记无效连接 --> <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLExceptionSorter"/> </pool> </datasource>
3. 额外检查项
- AD域设置:确认你的服务账号允许TGT续期(AD默认允许,最长续期到7天),如果有域策略限制,需要调整对应策略。
- JBoss补丁:EAP 6.4的早期版本可能存在Kerberos票据刷新的bug,建议升级到EAP 6.4的最新累积补丁版本,修复已知的认证相关问题。
原理说明
当你配置了renewTGT=true,LoginModule会在TGT过期前尝试续期;如果续期失败,useTicketCache=false会强制它用keytab重新获取新的TGT。同时连接池的验证机制会检测到持有过期票据的连接,将其销毁并创建新连接,新连接会触发安全域重新执行Kerberos认证流程,获取有效票据。
内容的提问来源于stack exchange,提问作者Lorenzo
相关产品推荐
相关产品推荐

