1

JNDI を使用して、ローカル ネットワークで Kerberos SRV レコードを検索したいと考えています。できれば巧妙な方法でローカル ドメインを推測しようとします。_kerberos._tcpそれが失敗した場合は、たとえばサフィックスなしで単純なエントリを検索し、DNS ドメイン検索リストに依存して正しいエントリを見つけたいと思います。これは、Windowsnslookup -type=srv _kerberos._tcpと Linux で動作しhost -t srv _kerberos._tcpます。ドメインexample.testが追加され、エントリが見つかります。

以下は、JNDI 経由で DNS ルックアップを行うプログラムの例です。

import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;

public class JndiDnsTest {

    public static void main(String[] args) {
        if (args.length < 2) {
            System.out.println("Usage: " + JndiDnsTest.class.getName() +
                    " name record-types...");
            return;
        }
        String name = args[0];
        String[] recordTypes = new String[args.length - 1];
        System.arraycopy(args, 1, recordTypes, 0, args.length - 1);
        Hashtable<String, String> env = new Hashtable<String,String>();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.dns.DnsContextFactory");
        try {
            DirContext ctx = new InitialDirContext(env);
            Attributes dnsQueryResult = ctx.getAttributes(name, recordTypes);
            if (dnsQueryResult == null) {
                System.out.println("Not found: '" + name + "'");
            }
            for (String rrType: recordTypes) {
                Attribute rr = dnsQueryResult.get(rrType);
                if (rr != null) {
                    for (NamingEnumeration<?> vals = rr.getAll(); vals.hasMoreElements();) {
                        System.out.print(rrType + "\t");
                        System.out.println(vals.nextElement());
                    }
                }
            }
        } catch (NamingException e) {
            e.printStackTrace(System.err);
        }
        System.out.println("\nThe DNS search list:");
        for (Object entry: sun.net.dns.ResolverConfiguration.open().searchlist()) {
            System.out.println(entry);
        }
        System.out.println("\nsun.net.spi.nameservice.domain = " +
                System.getProperty("sun.net.spi.nameservice.domain"));
    }
}

私には、JNDI が直接名のルックアップを 1 回だけ行うように見えます。上記のコマンドが成功するエントリは見つかりません。DNS 検索リストを使用していないようです。ただし、その内容は下部に正しく印刷されます。

一方、ネットワーキングプロパティのドキュメントには、

sun.net.spi.nameservice.domain プロパティが定義されていない場合、プロバイダは、プラットフォームの DNS 構成で構成された任意のドメインまたはドメイン検索リストを使用します。

(プロパティは設定されていません。) Java のバージョンは Sun Java 1.6.0_20 です。

JNDI は DNS 検索リストを使用しますか?

4

1 に答える 1

2

これは既知のバグです-http://bugs.sun.com/bugdatabase/view_bug.do?bug_id= 6427214

于 2012-01-04T16:14:58.387 に答える