好吧,所以我试图通过Kerberos从位于ubuntu上的Wildfly 9连接到MSSql Server . KDC是Microsoft AD .

我设法让它工作得很好,有一个看起来像这样的安全域:

<login-module code="org.jboss.security.negotiation.KerberosLoginModule" flag="required" module="org.jboss.security.negotiation">
    <module-option name="storeKey" value="false"/>
    <module-option name="useKeyTab" value="true"/>
    <module-option name="keyTab" value="/opt/wildfly-9.0.2/standalone/configuration/krb5.keytab"/>
    <module-option name="principal" value="app-BV"/>
    <module-option name="useTicketCache" value="false"/>
    <module-option name="debug" value="true"/>
    <module-option name="refreshKrb5Config" value="true"/>
    <module-option name="isInitiator" value="true"/>
    <module-option name="addGSSCredential" value="true"/>
    <module-option name="delegationCredential" value="USE"/>
    <module-option name="wrapGSSCredential" value="true"/>
</login-module>

我'm using a keytab, also using the new wrapGSSCredential flag because microsoft'的jdbc驱动程序在登录后立即处理该票据,在后续的sql调用中导致NPE没有设置此标志(参见bug description

这很好用,这意味着我可以连接到数据库,并在conn丢失后重新 Build 连接 .

什么是行不通的是更新 . 基本上情况如下:

  • Wildfly缓存获得的凭据

  • 即使基础故障单已过期,Wildfly对一组凭据的缓存验证也会一直通过

  • 10小时后(AD的故障单的默认生命周期),Wildfly传递给驱动程序的故障单已过期

  • sun Kerberos api在票证中查找TGT,但它找不到它,因此无法获得新票证 . 我得到的错误是:

GSSException:在sun.security.jgss.krb5.Krb5InitCredential.getInstance(Krb5InitCredential.java:147)中未提供有效凭据(机制级别:无法找到任何Kerberos tgt)

所以,我的问题是:除了不使用Jboss缓存(或使用infinispan并在它变得过时之前驱逐凭证)之外,还有其他方法可以获得新的Kerberos票证吗?