在把向CDC1.1 prot kerberos的时候,遇到了一个问题。
在CDC1.0.1上运行良好的程序,产生了“server not found in kerberos database(7)” 错误。
找来找去,结果发现是在构造PrincipalName Object的时候,有如下一段代码:(Kerberos V5的SUN实现,源码对外不开放)
if (nameParts.length >= 2) {
try {
String hostName = (InetAddress.getByName(nameParts[1])).getCanonicalHostName();
} catch (UnknownHostException e) {
// no canonicalization, just convert to lowercase
nameParts[1] = nameParts[1].toLowerCase();
}
}
注意其中resolve hostname的方法,是通过调用InetAddress.getCanonicalHostName()来实现的。
在CDC1.0.1的kerberos中,因为没有这个方法,所以用getHostname来代替的。
Canonicalize是指“最简化”,就是数学中将一个表达式化为其最简形式的意思。
好了,回头再来看我们的kerberos。
RFC 1510和1964,对principalName的命名方法作了规定。简单来说,就是principal name由两部分组成:
service@hostname
RFC 1964的描述如下:
"When a reference to a name of this type is resolved, the "hostname" is canonicalized by attempting a DNS lookup and using the fully-qualified domain name which is returned, or by using the "hostname" as provided if the DNS lookup fails. The canonicalization operation also maps the host's name into lower-case characters."
可是参看InetAddress.getCanonicalHostName()的API doc我们就发现问题了。该方法在解析失败后,返回的是IP地址,而不是“the 'hostname' as provided” -- 也就是InetAddress构造是所用的hostname。
这就导致了开始所说的错误。用户输入的是FQDN,而因某种原因,DNS解析失败后,principal name中的hostname却变成了IP address,这样的principal name当然在kerberos database中找不到了。
那么这是谁的bug?
InetAddress中getCanonocialHostName()的方法实现有问题?
RFC 1964要求canonicalize hostname,并说明了如何做,不过getCanonocialHostName()方法明显是不满足要求的,虽然挂了个canonical的名。当然了,这个方法不是仅在Kerberos的实现中使用,所以也不能说这个实现就不合规矩。
那么是Kerberos实现的错咯?
找了SUN的bugs database,没有找到相关的bugs报告。
我手头有的SUN实现的Kerberos,版本只到JDK1.5.0,不知道以后的版本中是不是修复了这个问题?
分享到:
相关推荐
java Bug模式详解
JAVA代码BUG分析JAVA代码BUG分析JAVA代码BUG分析JAVA代码BUG分析JAVA代码BUG分析JAVA代码BUG分析JAVA代码BUG分析JAVA代码BUG分析JAVA代码BUG分析
java java查bug 查bug bug 查错 源码
Java Bug模式详解
java 框架 bug处理 大全
Java.Bug模式详解 第1章 混乱环境下的灵活方法 1.1 软件设计、实现和维护的趋势 1.1.1 对于稳定、安全 系统的需求增加 1.1.2 传统软件工程技 术的局限性 1.1.3 开放源代码的软 件项目的可利用性 1.1.4 对于...
本书是为任何熟悉JAVA编程技术,并希望更有效地预防、解释、交流或者修正BUG的人员而编写。
JAVA.BUG模式详解java优化编程
Java Bug 模式详解
JAVA常见异常,JAVA异常,bugJAVA常见异常,JAVA异常,bug
java的BUG报告书和BUG和初学者上级练习素材;仅供新手练习参考
从一个开源站点下载下来的bug系统,从一个开源站点下载下来的bug系统
问题管理 BUG管理 任务管理 项目管理系统 仅供学习和参考
网上都是Java实现飞行棋,都有Bug,今天解决Bug可顺利运行,完了几把,爽;可以交作业了
可作为myeclipse的插件加入,可以检测java代码隐性的bug
Javabug描述报告书,
基于JAVA语言开发的bug管理系统
Findbugs工具使用方便,检查java代码bug能力极强,是Java程序员必备的工具之一。
java实现俄罗斯方块代码,存在的bug就是越界的问题。还有卡顿