java.io.IOException:无效的密钥库格式Spring Security SAML Extension

时间:2014-11-05 18:51:04

标签: spring spring-security spring-saml

我已经成功运行了Spring Security SAML Extension示例应用程序。现在,我试图将它集成到我的主应用程序中。在我尝试与我的应用程序集成之前,我创建了一个示例应用程序来集成它,它工作正常。在我的示例应用程序中,我使用了下载的示例应用程序中的密钥库。现在,我尝试使用相同的密钥库,我收到以下错误:

  

引起:org.springframework.beans.factory.BeanCreationException:   无法自动装配方法:public void   org.springframework.security.saml.metadata.MetadataGenerator.setKeyManager(org.springframework.security.saml.key.KeyManager);   嵌套异常是   org.springframework.beans.factory.BeanCreationException:错误   创建名为' keyManager'的bean在ServletContext中定义   resource [/WEB-INF/spring/securityContext.xml]:bean的实例化   失败;嵌套异常是   org.springframework.beans.BeanInstantiationException:不能   实例化bean类   [org.springframework.security.saml.key.JKSKeyManager]:构造函数   抛出异常;嵌套异常是java.lang.RuntimeException:错误   初始化密钥库   org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:596)     在   org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)     在   org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)     ... 89更多引起:   org.springframework.beans.factory.BeanCreationException:错误   创建名为' keyManager'的bean在ServletContext中定义   resource [/WEB-INF/spring/securityContext.xml]:bean的实例化   失败;嵌套异常是   org.springframework.beans.BeanInstantiationException:不能   实例化bean类   [org.springframework.security.saml.key.JKSKeyManager]:构造函数   抛出异常;嵌套异常是java.lang.RuntimeException:错误   初始化密钥库   org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:278)     在   org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1114)     在   org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1017)     在   org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)     在   org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)     在   org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:302)     在   org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)     在   org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)     在   org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)     在   org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1017)     在   org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:960)     在   org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858)     在   org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor $ AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:553)     ... 91更多引起:   org.springframework.beans.BeanInstantiationException:不能   实例化bean类   [org.springframework.security.saml.key.JKSKeyManager]:构造函数   抛出异常;嵌套异常是java.lang.RuntimeException:错误   初始化密钥库   org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:164)     在   org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:125)     在   org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:270)     ... 103更多引起:java.lang.RuntimeException:错误   初始化密钥库   org.springframework.security.saml.key.JKSKeyManager.initialize(JKSKeyManager.java:121)     在   org.springframework.security.saml.key.JKSKeyManager。(JKSKeyManager.java:79)     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native   方法)at   sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)     在   sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)     at java.lang.reflect.Constructor.newInstance(Constructor.java:526)     在   org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)     ... 105更多引起:java.io.IOException:密钥库格式无效     在   sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:650)     在   sun.security.provider.JavaKeyStore $ JKS.engineLoad(JavaKeyStore.java:55)     在java.security.KeyStore.load(KeyStore.java:1214)at   org.springframework.security.saml.key.JKSKeyManager.initialize(JKSKeyManager.java:117)     ...... 111更多

以下是JKSKeyManager的bean配置:

<bean id="keyManager" class="org.springframework.security.saml.key.JKSKeyManager">
        <constructor-arg value="classpath:security/samlKeystore.jks" />
        <constructor-arg type="java.lang.String" value="nalle123" />
        <constructor-arg>
            <map>
                <entry key="apollo" value="nalle123" />
            </map>
        </constructor-arg>
        <constructor-arg type="java.lang.String" value="apollo" />
    </bean>

任何人都可以帮我解决导致此错误的原因吗?

3 个答案:

答案 0 :(得分:7)

我有类似的问题;我想Maven正在过滤掉我的资源并添加它解决了这个问题:

   <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <excludes>
            <exclude>**/*.jks</exclude>
        </excludes>
    </resource>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>false</filtering>
        <includes>
            <include>**/*.jks</include>
        </includes>
    </resource>

答案 1 :(得分:2)

我有同样的问题。 Maven正在错误地复制二进制文件。

我必须将以下内容添加到我的maven-resources-plugin:

<nonFilteredFileExtensions>
    <nonFilteredFileExtension>jks</nonFilteredFileExtension>
</nonFilteredFileExtensions>

您可以通过在目标目录中运行命令来测试它:

keytool -list -keystore ~/<your_project_target_directory>/security/samlKeystore.jks

当我的maven正在错误地复制文件时,我得到了:

keytool error: java.io.IOException: Invalid keystore format

一旦我添加了nonFilteredFileExtension,我立即被提示输入密码。

答案 2 :(得分:-1)

您可以直接从Spring SAML源中直接替换您正在部署的Web存档中的samlKeystore.jks来开始进行故障排除。这可以帮助您确定问题是在密钥库中还是在代码中 - 很可能是密钥库。

如果您使用Maven构建应用程序,请确保密钥存储区位于构建中的resources文件夹中,而不是java或{{1 }}。 Maven在构建期间往往会损坏密钥库,除非它被放置在webapp文件夹中。