SM *_*MAR 15 ssl spring spring-security x509 spring-saml
我通过复制我计划连接的IDP的509条目生成了testIdp.cer文件.然后我通过执行以下命令创建了JKS文件
keytool -importcert -alias adfssigning -keystore C:\Users\user\Desktop\samlKeystore.jks -file C:\Users\user\Desktop\testIdp.cer
Run Code Online (Sandbox Code Playgroud)
执行时,它要求输入我已给出密码的密码.对于"信任这个证书?[no]:"这个问题,我给出了"y"作为输入.消息出现为"证书已添加到密钥库".
然后我在securityContext.xml中配置了以下详细信息
<bean id="keyManager" class="org.springframework.security.saml.key.JKSKeyManager">
<constructor-arg value="classpath:security/samlKeystore.jks"/>
<constructor-arg type="java.lang.String" value="mypassword"/>
<constructor-arg>
<map>
<entry key="adfssigning" value="mypassword"/>
</map>
</constructor-arg>
<constructor-arg type="java.lang.String" value="adfssigning"/>
</bean>
<bean class="org.springframework.security.saml.metadata.ExtendedMetadata">
<property name="alias" value="adfssigning" />
<property name="signingKey" value="adfssigning"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
但是当我运行应用程序时,我在服务器启动时以及加载应用程序的主页时会遇到以下两个异常.如果我错过任何其他内容,任何人都可以告诉我.
启动服务器时发生此异常
Caused by: org.opensaml.saml2.metadata.provider.FilterException: Signature trust establishment failed for metadata entry
at org.opensaml.saml2.metadata.provider.SignatureValidationFilter.verifySignature(SignatureValidationFilter.java:327)
at org.opensaml.saml2.metadata.provider.SignatureValidationFilter.processEntityGroup(SignatureValidationFilter.java:240)
at org.opensaml.saml2.metadata.provider.SignatureValidationFilter.doFilter(SignatureValidationFilter.java:158)
at org.opensaml.saml2.metadata.provider.AbstractMetadataProvider.filterMetadata(AbstractMetadataProvider.java:493)
at org.opensaml.saml2.metadata.provider.AbstractReloadingMetadataProvider.processNonExpiredMetadata(AbstractReloadingMetadataProvider.java:395)
Run Code Online (Sandbox Code Playgroud)
当我运行应用程序的主页时,会发生此异常
java.lang.UnsupportedOperationException: trusted certificate entries are not password-protected
at java.security.KeyStoreSpi.engineGetEntry(Unknown Source)
at java.security.KeyStore.getEntry(Unknown Source)
at org.opensaml.xml.security.credential.KeyStoreCredentialResolver.resolveFromSource(KeyStoreCredentialResolver.java:132)
Run Code Online (Sandbox Code Playgroud)
您的.cer证书只包含一个公钥,您不能<entry key="adfssigning" value="mypassword"/>为公钥定义; 它只能用于私人.只需取出adfssigning条目并确保包含私钥 - 就像在Spring SAML示例应用程序中一样.
SAML密钥库可以包含两种基本类型的密钥 - 公钥和私钥(以及它们的证书).每个键都有一个别名,用于引用它.密钥库本身可以受密码保护(在第二个构造函数参数中提供),另外每个私钥也可以通过附加密码保护(这些密码在别名 - >密码映射中的构造函数的第三个参数中定义).您必须在此映射中定义导入密钥库的公钥(就像您在上面的命令中所做的那样).它们将在导入后自动可用,无需其他声明.要使Spring SAML正常工作,密钥库必须至少包含一个私钥(示例应用程序包含带别名apollo的私钥),并且需要在构造函数的第三个参数中提供其别名.
上面的示例失败,因为您已导入公钥,但将其包含在地图中,该地图只能用于私钥.
弗拉基米尔正确地回答了这个问题,为什么错误发生.在我的回答中,我想展示如何将证书导入密钥库以解决该问题:
您必须导入无法通过keytool直接完成的证书和私钥.
详细描述的解决方案可在此处找到:https://stackoverflow.com/a/8224863/1909531
这是一段摘录:
openssl pkcs12 -export -in server.crt -inkey server.key \
-out server.p12 -name [some-alias] \
-CAfile ca.crt -caname root
keytool -importkeystore \
-deststorepass [changeit] -destkeypass [changeit] -destkeystore server.keystore \
-srckeystore server.p12 -srcstoretype PKCS12 -srcstorepass some-password \
-alias [some-alias]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20841 次 |
| 最近记录: |