我正在努力学习本教程中的spring-securitykerberos我有一个密钥标签,里面有一个主体:
ktutil: rkt http-web.keytab
ktutil: l
slot KVNO Principal
---- ---- ---------------------------------------------------------------------
1 3 HTTP/aulfeldt.hta.nightly@WAD.ENG.HYTRUST.COM
这个密钥标签是在win2k8域控制器上生成的,带有以下命令:
ktpass /out http-web.keytab /mapuser aulfeldt-hta-nightly@WAD.ENG.HYTRUST.COM /princ HTTP/aulfeldt.hta.nightly@WAD.ENG.HYTRUST.COM /pass *
它是在spnego.xml:中使用的测试web服务器上复制的
<bean class="org.springframework.security.extensions.kerberos.SunJaasKerberosTicketValidator">
<property name="servicePrincipal" value="HTTP/aulfeldt.hta.nightly@WAD.ENG.HYTRUST.COM" />
<property name="keyTabLocation" value="/WEB-INF/http-web.keytab" />
<property name="debug" value="true" />
</bean>
但未能找到原理:
Key for the principal HTTP/aulfeldt.hta.nightly@WAD.ENG.HYTRUST.COM not available in
jndi:/localhost/spring-security-kerberos-sample-1.0.0.CI-SNAPSHOT/WEB-INF/http-web.keytab
[Krb5LoginModule] authentication failed
Unable to obtain password from user
我已经尝试将web服务器(Centos 5.5,tomcat6)加入AD WAD。ENG.HYTRUST.COM,可以使用AD凭据登录,然后使用/etc/krb5.keytab中的主体来查看是否可以读取。。。同样的回应。我还尝试了很多大写和小写的名字变体。
ps今天早上从git那里查到了。
有几个错误导致"无法从用户处获取密码":
- 错误地指定了keytab文件的本地位置(就像@jasop指出);应该是这样的
classpath:http-web.keytab
或file:c:/http-web.keytabl
- 错误指定的主体名称(即与实际的不匹配,为其生成了keytab文件)
- keytab文件路径中的空白(请注意,如果修复),-在SPRING SECURITY KERBEROS/SPNEGO EXTENSION SpringSource博客条目的评论中看到了抱怨,并在我的开发环境-Windows 7/Java 6上收到了证据,-必须始终考虑绝对路径(即使类路径引用的keytab没有空格)
我遇到了完全相同的问题。
问题出在您的"keyTabLocation"设置上。不能将其设置为/WEB-INF/http-WEB.keytab
您需要将它设置为文件路径或类路径上的某个内容。
例如,我把我的文件放在类路径上,并进行了以下设置:
<property name="keyTabLocation" value="classpath:http-web.keytab" />
主体HTTP的密钥/aulfeldt.hta.nightly@WAD.ENG.HYTRUST.COM中不可用
我们只是在尝试使用SASL+Kerberos客户端来对Kafka代理进行身份验证时偶然发现了这个错误。问题是,他们的JVM不支持高级加密密码,因此无法从keytab中读取密钥,因此被忽略。
解决方案是升级他们的Java版本,因为现代>=Java8版本支持AES256和其他更高级的密码。
我们使用以下Java代码来测试AES:
/* Test to see if the current JVM supports AES > 128 */
public class UnlimitedSupportJCE {
public static void main(final String[] args) {
int strength = 0;
try {
strength = javax.crypto.Cipher.getMaxAllowedKeyLength("AES");
} catch (java.security.NoSuchAlgorithmException e) {
System.out.println("isUnlimitedSupported=FALSE");
}
if (strength > 128) {
System.out.println("AES cipher strength is " + strength);
} else {
// probably not good enough for many kerberos keys
System.out.println("Warning: AES cipher strength is only "+strength);
}
}
}