わかりましたので、ケルベロス経由でubuntuに座っているWildfly 9からMSSqlサーバーに接続しようとしています。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>
Microsoftのjdbcドライバーはログイン直後にチケットを破棄し、後続のSQL呼び出しでこのフラグが設定されていないNPEを引き起こすため、新しいwrapGSSCredentialフラグも使用しています(バグの説明を参照)
これは正常に動作します。つまり、データベースに接続でき、接続が失われた後に接続が再確立されます。
うまくいかないのは更新です。基本的には次のような状況です。
- Wildfly は取得した資格情報をキャッシュします
- 資格情報のセットに対する Wildfly のキャッシュ検証は、基礎となるチケットの有効期限が切れていても常にパスします。
- 10 時間後 (AD のチケットのデフォルトの有効期間)、Wildfly からドライバーに渡されたチケットの有効期限が切れます。
Sun Kerberos API はチケットで TGT を探しますが、見つからないため、新しいチケットを取得できません。私が得るエラーは次のとおりです。
GSSException: 有効な認証情報が提供されていません (メカニズム レベル: Kerberos tgt が見つかりませんでした) at sun.security.jgss.krb5.Krb5InitCredential.getInstance(Krb5InitCredential.java:147)
そこで、私の質問は次のとおりです。Jboss キャッシュを使用しない (または infinispan を使用し、資格情報が古くなる前に削除する) 以外に、新しい Kerberos チケットを取得する方法はありますか?