在把向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编程基础的开发者,旨在帮助他们更好地理解和解决在编程过程中遇到的各种错误和异常,提升代码质量和维护效率。书中深入剖析了Java编程中常见的bug模式,通过实例...
Java Bug模式详解主要涵盖的是Java编程中常见的错误和陷阱,这些错误往往会导致程序运行异常或者性能下降。在软件开发过程中,理解和避免这些Bug模式对于提高代码质量和效率至关重要。本资源包含一本PDF电子书《Java...
java 框架 bug处理 大全
"查bug"和"查错"是每个Java开发者必备的技能,而深入理解源码则能帮助我们更好地定位和解决问题。 在Java中,查bug通常涉及以下几个关键步骤: 1. **复现问题**:首先,我们需要在开发环境中重现bug,这包括了理解...
【Java Bug系统】是一个专为跟踪和管理软件开发过程中出现的错误或问题的系统,它通常用于记录、分类、优先级排序以及修复这些bug。在Java编程语言中,开发这样的系统意味着利用Java的强大特性和丰富的类库来实现...
Java开源的Bug管理系统是一款基于Java技术构建的问题跟踪与解决工具,它主要用于协助软件开发团队进行有效的缺陷管理和项目任务控制。这个系统通常包含了多种功能模块,如问题报告、故障分类、优先级设定、状态追踪...
在Java编程中,"BUG模式"通常指的是程序员在编写代码时容易犯的一些常见错误或陷阱,这些错误可能导致程序运行不正常、性能下降甚至系统崩溃。理解并避免这些BUG模式是提高Java程序质量和效率的关键。本篇文章将深入...
基于java软件bug管理系统设计与实现
### Java类型BUG总结 #### 一、糟糕的命名习惯 **问题描述:** 糟糕的命名习惯会导致代码可读性差,难以维护。例如,使用`i`, `ii`, `j`, `k`作为循环变量,这虽然在某些情况下是常见的做法,但对于变量的功能描述...
Java编程语言以其强大的跨平台能力和丰富的库支持深受程序员喜爱,但对于初学者来说,理解并解决各种BUG是学习过程中的一大挑战。这份"java的BUG集锦以及初学者上级练习素材全套.zip"提供了丰富的资源,旨在帮助新手...
标题中的"BTS.rar"可能指的是Bug Tracking System(BUG跟踪系统)的压缩文件,而"BTS_bug_java bug_系统"进一步强调了这个系统是专门针对Java编程语言中的bug进行管理和跟踪的。结合描述,我们可以深入探讨以下几个...
在IT行业中,问题管理、BUG管理、任务管理和项目管理是软件开发流程中的核心环节,尤其在Java编程领域,这些管理工具和技术的应用对于提高团队效率、保证产品质量至关重要。本压缩包文件"java问题管理 BUG管理 任务...
《基于JAVA语言开发的Bug管理系统详解》 在软件开发过程中,Bug管理是至关重要的环节,它关乎着软件质量与用户体验。本文将深入探讨基于JAVA语言开发的Bug管理系统,旨在为开发者提供一个全面的理解和实践指南。 ...
Java Bug模式详解是一种深入理解和解决Java编程中常见错误和陷阱的方法。这些模式通常源于语言特性、API使用不当或对编程规范的误解。本篇将详细探讨一些常见的Java Bug模式,并提供预防和修复策略。 1. **空指针...
本篇文章将详细讨论如何解决在Java实现飞行棋时遇到的常见Bug,确保游戏能够顺利运行。 首先,我们需要了解飞行棋的基本规则。飞行棋通常有四个颜色的棋子,玩家轮流掷骰子决定棋子的移动步数。棋子可以跳跃,当一...
在编程领域,构建一个无bug的程序是一项挑战,...总的来说,创建一个无bug的Java计算器需要对Java语言有深入的理解,包括类、方法、异常处理以及数值计算。同时,良好的编程习惯和严谨的测试策略是确保代码质量的关键。
### JAVA常见异常BUG详解 #### 一、Java.lang.ArrayStoreException **定义**: `java.lang.ArrayStoreException` 是一种运行时异常(RuntimeException),当尝试向一个特定类型的对象数组存储不兼容类型的对象时...
【描述】:“Javabug描述报告书”是针对Java应用程序中发现的错误而编写的,它通常包括错误的详细描述、复现步骤、影响范围以及期望的行为。编写这样的报告书,目的是确保问题能够被有效地追踪和修复,避免未来类似...