【问题标题】:java.io.IOException: Invalid keystore format Spring Security SAML Extensionjava.io.IOException:无效的密钥库格式 Spring Security SAML 扩展
【发布时间】:2015-01-02 02:15:18
【问题描述】:

我已成功运行 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:错误 创建 ServletContext 中定义的名称为“keyManager”的 bean 资源[/WEB-INF/spring/securityContext.xml]:bean的实例化 失败的;嵌套异常是 org.springframework.beans.BeanInstantiationException:不能 实例化 bean 类 [org.springframework.security.saml.key.JKSKeyManager]:构造函数 抛出异常;嵌套异常是 java.lang.RuntimeException: Error 在初始化密钥库 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:错误 创建 ServletContext 中定义的名称为“keyManager”的 bean 资源[/WEB-INF/spring/securityContext.xml]:bean的实例化 失败的;嵌套异常是 org.springframework.beans.BeanInstantiationException:不能 实例化 bean 类 [org.springframework.security.saml.key.JKSKeyManager]:构造函数 抛出异常;嵌套异常是 java.lang.RuntimeException: Error 在初始化密钥库 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: Error 在初始化密钥库 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) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native 方法)在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:526) 在 org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148) ... 105 更多原因:java.io.IOException: Invalid keystore format 在 sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:650) 在 sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:55) 在 java.security.KeyStore.load(KeyStore.java:1214) 在 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>

谁能帮我解决导致此错误的原因?

【问题讨论】:

    标签: spring spring-security spring-saml


    【解决方案1】:

    我遇到了同样的问题。 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】:

      我也有类似的问题;我认为 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>
      

      【讨论】:

      • 解决了问题!一个奇怪的是,一开始我想把密钥库放在src/main/resources/properties/security/saml 中,而 Maven 资源过滤破坏了密钥库。当我将samlKeystore.jks 移动到src/main/resources/security/ 时,它开始起作用。我想知道**/*.jks 过滤器是完全递归的还是只适用于一级文件夹。
      【解决方案3】:

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

      如果您使用 Maven 构建应用程序,请确保将密钥存储放置在您构建的 resources 文件夹中,而不是 javawebapp 中。 Maven 倾向于在构建过程中损坏密钥库,除非它被放置在 resources 文件夹中。

      【讨论】:

      • 它位于resources 文件夹下。我只是将它放在与示例相同的安全文件夹下。您指的是哪些 Spring SAML 来源?
      • 我按照您的建议替换了密钥库,但仍然出现错误。我们使用的是 Maven,但正如我之前所说,它位于资源文件夹下。还有其他建议吗?
      • 还有其他建议吗?
      • 不幸的是,并非没有重现它的可能性。这就像在黑暗中拍摄。
      猜你喜欢
      • 2023-03-20
      • 2010-11-06
      • 1970-01-01
      • 2014-11-22
      • 1970-01-01
      • 2022-12-14
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      相关资源
      最近更新 更多