web-dev-qa-db-ja.com

Javaの単純なKerberosクライアント?

GoogleのようなアプリケーションChromeおよびIEはKerberos認証を透過的に処理できますが、「シンプルな」Java私が見つけたすべての解決策は、上記のアプリのいずれかが必要と思われるkrb5.confファイルとlogin.confファイルの存在を必要とします。

動作するKerberos SSO機能を備えたJavaアプリケーションを構築する最良の方法は何ですか?

[更新]:明確にするために[〜#〜] client [〜#〜]チケットの作成ではないためのサイドソリューションが必要ですそれらを検証します。また、SPNEGOは最終的にKerberosに委任されるデフォルトの「ラッパー」プロトコルであるようですが、SPNEGOプロトコルも処理できる必要があります。

35
Andrew White

Oracleには JavaのSaslClientを使用した例 があります。私はJavaプログラマーではありませんが、一度これを誰かに指摘したとき、彼らはそれをかなり早く動作させることができました。 nb Kerberosは、多くの場合KRB5_で始まる環境変数を使用して、そのようなファイルを探す場所を認識します。また、Kerberos自体にはいかなる種類のトランスポートも含まれていないことに注意してください。サーバーが期待する方法(これは認証しようとしているサーバーによって異なります)。

編集:質問を編集したので、ここにJavaのSPNEGOに関連するリンクがあります。これは何らかの用途があるかもしれません: http://download.Oracle.com/javase/6/ docs/technotes/guides/security/jgss/lab/part5.html

8
John Zwinck

Apache HTTP Components Client 4.5以上を使用して、これに対する簡単な解決策があります。これは4.5ではまだ実験的であるとマークされているため、マイレージは異なる場合がありますが、これはエンタープライズ環境ではうまく機能しています。

HC 4.5クライアントjarに加えて、http-component-clientで提供されるように、クラスパスにhttpclient-win、jna、およびjna-platform jarが必要です。次に、Kerberos対応のHCクライアントを次のように構築します。

CloseableHttpClient httpclient = WinHttpClients.createDefault();

または、ビルダーを使用して:

HttpClientBuilder clientBuilder = WinHttpClients.custom();

クライアントを構築する前に、必要に応じてカスタマイズできます。

CloseableHttpClient client = clientBuilder.build();

このソリューションは、外部構成なしで機能し、最も重要なことは、Windows 7以降でローカル管理者権限を持つユーザーの組み込みJREメカニズムが壊れる問題を解決することです。これは、KerberosチケットがJREによって提供されるGSSAPIを通過するのではなく、JNAを介してSSPI APIから直接取得されるために可能です。

コード例 http-componentsチームから

これはすべて ダニエル・ドゥブロブキンティモシー・ウォール および ライアン・マッキンリー の良い仕事によって可能になりました。

13
Malcolm Smith

デイビッド・ルーセルに追加すると、URL固有のHTTPベースのKerberos認証に関する回答が表示されます。

コードが機能する理由は、ターゲットSPN(サーバー側プリンシパル)がHTTP/[email protected]で構成されているためです。その場合、トークンを明示的に設定していないため機能します。 URLConnectionは、そのSPNでトークンを内部的に設定します

1件名を取得するための手順(以前の回答から)を実行します

2 gss api init secコンテキストを使用して、コンテキストトークンを生成します。このステップには多数のチュートリアルがあります

3 Base 64はトークンをエンコードします

4 url​​connectionにトークンを添付します-

URL url = new URL("http://myhost/myapp")
HttpURLConnection urlConn = (HttpURLConnection)url.openConnection(); = 
urlConn.setRequestProperty("Authorization", "Negotiate " + encodedToken);

5権限のあるアクションを実装します-

//this internally calls the getInputStream
public class PrivilegedGetInputStream implements PrivilegedExceptionAction<InputStream>

6 Subject.doAsですべてをラップする

//use prev answer instructions to get subject
Subject.doAs(subject, new PrivilegedGetInputStream(urlConnection)
9
Arunav Sanyal

実際には何もする必要はありません。 Java 6では、Windowsクライアントマシンでは次のことができます。

new URL("http://myhost/myapp").openStream();

そして、ネゴシエート認証は機能します。少なくとも私にとってはそうです。そして、私がテストしたサーバーはNegotiateのみをサポートし、NTLM認証はサポートしていません。

7
David Roussel

Login.confファイルの使用を避けたい場合は、異なるコーディングが必要です。

//define your own configuration
import javax.security.auth.login.Configuration;
public class CustomLoginConfiguration extends Configuration

//pass certain parameters to its constructor
//define an config entry
import javax.security.auth.login.AppConfigurationEntry;
private AppConfigurationEntry configEntry;

//define a map of params you wish to pass and fill them up
//the map contains entries similar to one you have in login.conf
Map<String, String> params = new HashMap<String, String>();

//define the configuration
configEntry = new AppConfigurationEntry(
            "com.Sun.security.auth.module.Krb5LoginModule",
            AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, params);

//implement getappconfig method
public AppConfigurationEntry[] getAppConfigurationEntry() {
    return new AppConfigurationEntry[] { configEntry };
}

この定義を完了したら、これを使用してkdcからチケットを取得できます。

//get ticket in login context
LoginContext lc = null;
    lc = new LoginContext("lc", null, callback, new CustomLoginConfiguration(argumentlist));
    lc.login();

これから、jaas件名を取得でき、基本的に大量の認証を行うことができます。

さらにポインタが必要な場合は、コメントを残してください。

4
Arunav Sanyal

構成ファイルの代わりにシステムプロパティを使用してKDCホスト名とサービス名を指定できますが、これらの(少なくとも)ものは必須です。

ワッフルは、チケットを取得できない場合でも、ほとんどのプロパティを設定するために必要な情報を実際に提供します。 WindowsAuthProviderImplクラスを見てください(Waffle.chmヘルプファイルにAPIが示されています)。

JAASを使用して、2つの手順でActive Directoryからサービスチケットを取得します。

  1. Krb5LoginModuleを使用して、キャッシュされたTGTを取得し、サブジェクトに追加します。

  2. SubjectとGSS-APIを使用して、KDCからサービスチケットを取得します。

The Java Way of Active Directory には、多くの優れた情報とサンプルコードがあります。

2
Mermeister

Httpclientからkerberosへの接続を簡単にする小さなツールを作成しました。試してみてください。 https://github.com/DovAmir/httpclientAuthHelper

DefaultHttpClient httpclient = new DefaultHttpClient();
AuthUtils.securityLogging(SecurityLogType.KERBEROS,true);
CredentialsUtils.setKerberosCredentials(client, new UsernamePasswordCredentials("xxx", "xxx"), "domain", "kdc");
client.executeMethod(httpget);
1
dov.amir
0
Alex
0
Sachith Withana