プレーン Java (Adoptium の JDK 11 上のサーバーを使用しない単純なローカル アプリケーション) では、次のように Kerberos 認証を使用して DB 接続を正常に作成できます。
String connectionUrl = "jdbc:sqlserver://SQL-Server-Name:14333;databaseName=test;integratedSecurity=true;authenticationScheme=JavaKerberos;applicationName=Test;";
Connection connection = DriverManager.getConnection(connectionUrl, user, password);
追加の構成ファイルや JVM 設定は必要ありません。
これは、Windows ワークステーションと、Kerberos 用に構成された Linux サーバーで動作しています。これは、Kerberos が OS レベルで正しく構成され、JDBC で使用できることを証明していると思います。
ここで、WildFly 26 の MSSQL JDBC (9.4) を介して Hibernate のデータベース接続に Kerberos 認証を使用したいと考えています。
<datasource jta="true" jndi-name="java:/datasources/someDS" pool-name="somePoolDS" enabled="true" use-java-context="true">
<connection-url>jdbc:sqlserver://SQL-Server-Name</connection-url>
<driver-class>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver-class>
<datasource-class>com.microsoft.sqlserver.jdbc.SQLServerDataSource</datasource-class>
<connection-property name="serverName">SQL-Server-Name\Instanz03</connection-property>
<connection-property name="portNumber">14333</connection-property>
<connection-property name="databaseName">Test</connection-property>
<connection-property name="applicationName">test</connection-property>
<connection-property name="integratedSecurity">true</connection-property>
<connection-property name="authenticationScheme">JavaKerberos</connection-property>
<driver>sqlserver</driver>
<transaction-isolation>TRANSACTION_READ_UNCOMMITTED</transaction-isolation>
<pool>
<max-pool-size>100</max-pool-size>
</pool>
<security>
<user-name>UserXyz</user-name>
<password>PassXyz</password>
</security>
<validation>
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLValidConnectionChecker"/>
<background-validation>true</background-validation>
</validation>
</datasource>
<driver name="sqlserver" module="com.microsoft.mssql">
<xa-datasource-class>com.microsoft.sqlserver.jdbc.SQLServerXADataSource</xa-datasource-class>
<datasource-class>com.microsoft.sqlserver.jdbc.SQLServerDataSource</datasource-class>
</driver>
これは機能していません。根本的な原因は次のとおりです。
Caused by: GSSException: No valid credentials provided (Mechanism level: Server not found in Kerberos database (7))
at java.security.jgss/sun.security.jgss.krb5.Krb5Context.initSecContext(Krb5Context.java:773)
at java.security.jgss/sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:266)
at java.security.jgss/sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:196)
at com.microsoft.mssql//com.microsoft.sqlserver.jdbc.KerbAuthentication.intAuthHandShake(KerbAuthentication.java:158)
... 149 more
Caused by: KrbException: Server not found in Kerberos database (7)
at java.security.jgss/sun.security.krb5.KrbTgsRep.<init>(KrbTgsRep.java:70)
at java.security.jgss/sun.security.krb5.KrbTgsReq.getReply(KrbTgsReq.java:226)
at java.security.jgss/sun.security.krb5.KrbTgsReq.sendAndGetCreds(KrbTgsReq.java:237)
at java.security.jgss/sun.security.krb5.internal.CredentialsUtil.serviceCredsSingle(CredentialsUtil.java:477)
at java.security.jgss/sun.security.krb5.internal.CredentialsUtil.serviceCreds(CredentialsUtil.java:340)
at java.security.jgss/sun.security.krb5.internal.CredentialsUtil.serviceCreds(CredentialsUtil.java:314)
at java.security.jgss/sun.security.krb5.internal.CredentialsUtil.acquireServiceCreds(CredentialsUtil.java:169)
at java.security.jgss/sun.security.krb5.Credentials.acquireServiceCreds(Credentials.java:490)
at java.security.jgss/sun.security.jgss.krb5.Krb5Context.initSecContext(Krb5Context.java:697)
... 152 more
Caused by: KrbException: Identifier doesn't match expected value (906)
at java.security.jgss/sun.security.krb5.internal.KDCRep.init(KDCRep.java:140)
at java.security.jgss/sun.security.krb5.internal.TGSRep.init(TGSRep.java:65)
at java.security.jgss/sun.security.krb5.internal.TGSRep.<init>(TGSRep.java:60)
at java.security.jgss/sun.security.krb5.KrbTgsRep.<init>(KrbTgsRep.java:55)
... 160 more
ただし、 authenticationScheme を「NTLM」に変更すると、すぐに機能します。これは、データソースの構成自体が正しいという証拠だと思います。
問題は、JDBC の Kerberos 認証が WildFly 内から機能しないのはなぜですか? WildFly は、おそらく Kerberos 認証に関連するデフォルトの JVM 設定を変更しますか?
何が起こっているのかを理解する方法のヒントがあれば幸いです。