0

プレーン 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 設定を変更しますか?

何が起こっているのかを理解する方法のヒントがあれば幸いです。

4

0 に答える 0