16

WindowsでJavaを使用してクライアント側のHTTPSPNEGO認証を行うには、Windowsレジストリキーallowtgtsessionkeyを設定する必要があります。これは十分に文書化されています。私が理解していないのは、人々がこれをどのように回避するかです。ほとんどの企業サイトは、単一のソフトウェアのためにWindowsでこのレジストリキーを変更することを決して受け入れません。また、組織内のすべてのワークステーションでこれを変更する必要がある場合は、面倒なことも考えてください。しかし、これまでのところ、このレジストリキーを変更するようにお客様を説得することができなかったため、これは単なる理論です。

私は彼らを責めません。ほとんどの企業管理者は、これがセキュリティを緩和すると考えているため、反対します。

私はこれを読みました: ネイティブSSPI APIを使用してサービスのKerberosチケットを取得する方法はJavaまたはコマンドラインユーティリティにありますか?

でも今はかなり古いです。

ですから、大学の環境やホームユーザーなど以外で、Windows+Javaクライアント+Kerberosをどのように機能させることができるのか本当によくわかりません。

企業の管理者からの質問は、「IEやFirefoxなどのアプリケーションでこのキーを設定せずにSPNEGOを実行しても問題がないのに、なぜこのレジストリキーを設定する必要があるのですか?」です。まあ、私は答えが何であるかを知っています。これは、(ほとんどの場合)IEやFirefoxなどのアプリケーションがWindowsネイティブGSS API(SSPI)に基づいているのに対し、SunのJavaは独自の実装を使用しているためです。

WAFFLEのようなものを使用すれば問題は解決すると思いますが、純粋なJavaソリューションを好みます。また、SpringセキュリティやApache HttpClientなどのJavaベースのソリューションを使用しても、これらすべてがこの問題に悩まされるため、役に立たないと思います。

ヘルプやポインタをいただければ幸いです。

UPDATE1

OracleのバグデータベースにこのためのRFEがあることがわかりました。オラクルの従業員によってこの問題について提出されたパッチと、この機能に関するJDKメーリングリストでの議論もあります。これが現在のJava7で利用できないことを理解できる限り、実験的でさえない限り、私はそれほど賢くなりません。右?

UPDATE2

質問は、OpenJDKSecurityDevメーリングリストで再び生きています。

4

4 に答える 4

10

security-devメーリングリストで私のスレッドを参照していただきありがとうございます;-)私の中期的な目標は、承認されたクラスパスを介してこのパッチをJava6以降で利用できるようにすることです。私が最近作成したこのWAFFLEチケットに興味があるかもしれません:https ://github.com/dblock/waffle/issues/50

私もWAFFLEを評価しましたが、Java-GSSのように重複コードを作成する必要があるので、これは絶対に避けたいものです。

この問題全体は、正確にはOracleのせいではありません。CallPackageMicrosoftは、LSA関数を介してセッションチケットへの呼び出しをブロックしているだけです。口実はセキュリティです。TGTに合理的にアクセスできない場合に、SSPIがサービスチケットを作成する方法を本当に知りたいです。したがって、そのようなクローズドソースソリューションは最悪です。

現在のところ、選択肢は3つだけです。

  1. Java手段を介してTGTを再度取得する
  2. ワッフルをお試しください
  3. カスタムコードを書く

とにかくドメインアカウントを持つローカル管理者には機能しないので、私は安っぽいレジストリキーを埋めました。私の場合、Windows上のTomcat devは、その間にJavaのkinitを呼び出すことにしました。

于 2013-01-28T10:30:32.190 に答える
1

これには、JNAを使用してネイティブSSPI APIからチケットを取得する、ApacheHTTPクライアントに含まれる非常に優れたソリューションがあります。この答えを参照してください:

https://stackoverflow.com/a/22865583/381161

于 2015-10-02T14:57:42.347 に答える
1

Java 13以降、JDK forWindows独自のGSSAPI(別名SSPI)に組み込みのサポートがあります。

Java13およびJDK-6722928のリリースノートを参照してください。

更新: これはJava11にバックポートされました。Java11.0.10以降を使用する必要があります。sspi_bridge.dllディレクトリに名前が付けられたファイルが含まれている場合、JDKディストリビューションがSSPIをサポートしているかどうかを認識できますbin

Java 8にバックポートするチケットもありますが、2021年11月の時点では実装されていません。

于 2019-11-22T22:48:13.640 に答える
1

Java 8を使用した簡単なソリューションを探している人にとっては、ワッフルが最良の選択です。

コード:

import java.net.URI;
import java.util.Base64;

import waffle.windows.auth.IWindowsSecurityContext;
import waffle.windows.auth.impl.WindowsSecurityContextImpl;

public class KerberosCredentiels {

  /**
   * Generate current user token using Kerberos ticket
   */
  public String retrieveToken(URI uri) {
    IWindowsSecurityContext clientContext = WindowsSecurityContextImpl.getCurrent("Kerberos", convertToSPN(uri));
    byte[] token = clientContext.getToken();

    return Base64.getEncoder().encodeToString(token);
  }

  private static String convertToSPN(URI uri) {
    StringBuilder builder = new StringBuilder();

    builder.append("http/");
    builder.append(uri.getHost());

    return builder.toString();
  }

}

Mavenの依存関係:

<dependency>
    <groupId>com.github.waffle</groupId>
    <artifactId>waffle-jna</artifactId>
    <version>1.8.3</version>
</dependency>

<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna-platform</artifactId>
    <version>4.3.0</version>
</dependency>

<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>4.3.0</version>
</dependency>
于 2021-11-04T15:59:47.353 に答える