弹簧-安全-科贝罗斯无法读取键盘?



我正在努力学习本教程中的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那里查到了。

有几个错误导致"无法从用户处获取密码":

  1. 错误地指定了keytab文件的本地位置(就像@jasop指出);应该是这样的classpath:http-web.keytabfile:c:/http-web.keytabl
  2. 错误指定的主体名称(即与实际的不匹配,为其生成了keytab文件)
  3. 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);
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新