12

次のコードがあります。

public static void main(String args[]){
    try {
        //String ticket = "Negotiate YIGCBg...==";
        //byte[] kerberosTicket = ticket.getBytes();
        byte[] kerberosTicket = Base64.decode("YIGCBg...==");
        GSSContext context = GSSManager.getInstance().createContext((GSSCredential) null);
        context.acceptSecContext(kerberosTicket, 0, kerberosTicket.length);
        String user = context.getSrcName().toString();
        context.dispose();
    } catch (GSSException e) {
        e.printStackTrace();
    } catch (Base64DecodingException e) {
        e.printStackTrace();
    }
}

もちろん失敗します。例外は次のとおりです。

GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag)

これを解決するために何をすべきかわかりません。正直なところ、私は Kerberos をよく理解していません。

WWW-Authenticate値として「Negotiate」を含む適切なヘッダーを付けて 401 を送信することで、このチケットを取得しました。authorizationブラウザーは、このチケットを含むヘッダーを使用して、同じ要求をすぐに再度発行しました。

チケットを検証して、ユーザーが誰であるかを特定できることを望んでいました。

キータブファイルは必要ですか? もしそうなら、どの資格情報でこれを実行しますか? Web サイトの認証に Kerberos チケットを使用しようとしています。資格情報は IIS からの資格情報でしょうか?

私は何が欠けていますか?


更新 1 Michael-O の返信から、もう少しグーグルで調べたところ、この記事が見つかり、この記事にたどり着きました。

table 3で、 を見つけました1.3.6.1.5.5.2 SPNEGO

最初の記事の例に従って、資格情報にそれを追加しました。これが私のコードです:

public static void main(String args[]){
    try {            
        Oid mechOid = new Oid("1.3.6.1.5.5.2");

        GSSManager manager = GSSManager.getInstance();

        GSSCredential myCred = manager.createCredential(null,
                GSSCredential.DEFAULT_LIFETIME,
                mechOid,
                GSSCredential.ACCEPT_ONLY);

        GSSContext context = manager.createContext(myCred);

        byte[] ticket = Base64.decode("YIGCBg...==");
        context.acceptSecContext(ticket, 0, ticket.length);
        String user = context.getSrcName().toString();
        context.dispose();
    } catch (GSSException e) {
        e.printStackTrace();
    } catch (Base64DecodingException e) {
        e.printStackTrace();
    }
}

しかし、コードは次のcreateCredentialエラーで失敗しています。

GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos credentails)

チケット全体は次のとおりです。YIGCBgYrBgEFBQKgeDB2oDAwLgYKKwYBBAGCNwICCgYJKoZIgvcSAQICBgkqhkiG9xIBAgIGCisGAQQBgjcCAh6iQgRATlRMTVNTUAABAAAAl7II4g4ADgAyAAAACgAKACgAAAAGAbEdAAAAD0xBUFRPUC0yNDVMSUZFQUNDT1VOVExMQw==

4

3 に答える 3

6

これは Kerberos チケットではなく、SPNEGO チケットです。あなたのコンテキストには間違ったメカニズムがあります。

編集: ただし、正しいメカニズムが得られましたが、クライアントは、GSS-API が処理できない NTLM トークンを送信しています。Base 64 トークンを取得し、生のバイトにデコードして ASCII 文字を表示します。で始まる場合NTLMSSP、確実に機能せず、Kerberos セットアップが壊れています。

編集 2: これはあなたのチケットです:

60 81 82 06 06 2B 06 01 05 05 02 A0 78 30 76 A0 30 30 2E 06  `..+..... x0v 00..
0A 2B 06 01 04 01 82 37 02 02 0A 06 09 2A 86 48 82 F7 12 01  .+....7.....*H÷..
02 02 06 09 2A 86 48 86 F7 12 01 02 02 06 0A 2B 06 01 04 01  ....*H÷......+....
82 37 02 02 1E A2 42 04 40 4E 54 4C 4D 53 53 50 00 01 00 00  7...¢B.@NTLMSSP....
00 97 B2 08 E2 0E 00 0E 00 32 00 00 00 0A 00 0A 00 28 00 00  .².â....2.......(..
00 06 01 B1 1D 00 00 00 0F 4C 41 50 54 4F 50 2D 32 34 35 4C  ...±.....LAPTOP-245L
49 46 45 41 43 43 4F 55 4E 54 4C 4C 43                       IFEACCOUNTLLC       

これは、SPNEGO トークン内にラップされた NTLM トークンです。これは単純に、Kerberos が何らかの理由で失敗したことを意味します。

  • SPN が登録されていません
  • クロックスキュー
  • ケルベロスには許可されていません
  • DNS レコードが正しくない

最適なオプションは、クライアントで Wireshark を使用して根本原因を見つけることです。

Java はNTLM を SPNEGO サブメカニズムとしてサポートしていないことに注意してください。NTLM は、SSPI と Heimdal でのみサポートされています。

于 2014-08-18T19:38:06.403 に答える