我想使用JNDI在本地網絡中查找Kerberos SRV記錄。我試圖以有希望的方式猜測本地域名。如果失敗,我想查找簡單的條目,例如_kerberos._tcp
沒有任何後綴,並依靠DNS域搜索列表來查找正確的條目。這可以在Windows上使用nslookup -type=srv _kerberos._tcp
和Linux使用host -t srv _kerberos._tcp
。附加域example.test
並找到該條目。JNDI是否使用DNS搜索列表?
下面是一個例子程序通過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只做了直接的名字一個查找。在上述命令成功的地方找不到任何條目。它似乎不使用DNS搜索列表。不過,它的內容在底部正確打印。
在另一方面Networking properties documentation說
如果沒有定義sun.net.spi.nameservice.domain屬性,則提供程序將使用在平臺配置DNS配置了任何域或域搜索列表。
(該屬性未設置。)Java版本是Sun Java 1.6.0_20。
JNDI是否使用DNS搜索列表?