HTTP状态401 - 身份验证失败:解码传入的SAML消息时出错

时间:2016-12-20 09:07:38

标签: spring-saml

除了我添加

之外,我按spring saml tutorial中所述完成了所有操作
<dependency>
    <groupId>xml-apis</groupId>
    <artifactId>xml-apis</artifactId>
    <version>1.4.01</version>
</dependency>
在pom.xml中

克服w3.dom类未找到问题。当我运行示例项目时,我得到了 浏览器中HTTP Status 401 - Authentication Failed: Error decoding incoming SAML message,同时控制台中(CertPathPKIXTrustEvaluator.java:81) ERROR org.springframework.security.saml.trust.MetadataCredentialResolver - PKIX path construction failed for untrusted credential: [subjectName='CN=idp.ssocircle.com' |credential entityID='https://idp.ssocircle.com']: unable to find valid certification path to requested target

包流屏幕截图: package flow screenshot

第2天: 我运行keytool -importcert -alias identtrustca -file ca.cer -keystore samlKeystore.jks并用新生成的security/samlKeystore.jks替换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="nalle123"/> <constructor-arg> <map> <entry key="apollo" value="nalle123"/> </map> </constructor-arg> <constructor-arg type="java.lang.String" value="apollo"/> </bean>

Caused by: java.io.IOException: Keystore was tampered with, or password was incorrect
    at sun.security.provider.JavaKeyStore.engineLoad(Unknown Source)
    at sun.security.provider.JavaKeyStore$JKS.engineLoad(Unknown Source)
    at java.security.KeyStore.load(Unknown Source)
    at org.springframework.security.saml.key.JKSKeyManager.initialize(JKSKeyManager.java:117)
    ... 57 more
Caused by: java.security.UnrecoverableKeyException: Password verification failed
    ... 61 more

然后我有:

keytool

然后我使用我在使用<bean id="keyManager" class="org.springframework.security.saml.key.JKSKeyManager"> <constructor-arg value="classpath:security/samlKeystore.jks"/> <constructor-arg type="java.lang.String" value="123456"/> <constructor-arg> <map> <entry key="apollo" value="123456"/> </map> </constructor-arg> <constructor-arg type="java.lang.String" value="apollo"/> </bean> 时输入的密码更改密码:

Servlet.service() for servlet [jsp] in context with path [/spring-security-saml2-sample] threw exception
java.lang.RuntimeException: Key for alias apollo not found
    at org.springframework.security.saml.metadata.MetadataGenerator.getServerKeyInfo(MetadataGenerator.java:201)

然后控制台说:

apollo

所以我将identtrustca更改为<bean id="keyManager" class="org.springframework.security.saml.key.JKSKeyManager"> <constructor-arg value="classpath:security/samlKeystore.jks"/> <constructor-arg type="java.lang.String" value="123456"/> <constructor-arg> <map> <entry key="identtrustca" value="123456"/> </map> </constructor-arg> <constructor-arg type="java.lang.String" value="identtrustca"/> </bean>

Servlet.service() for servlet [jsp] in context with path [/spring-security-saml2-sample] threw exception
java.lang.UnsupportedOperationException: trusted certificate entries are not password-protected

和控制台说:

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

然后我读了thisthis,所以我删除了entry元素(我相信它是私钥的东西),它变成了:

Servlet.service() for servlet [jsp] in context with path [/spring-security-saml2-sample] threw exception
java.lang.RuntimeException: Key with alias identtrustca doesn't have a private key

现在问题变成了:

keytool -list -V -keystore d:\temp\samlKeystore.jks

第2天第2部分: 现在我明白了,我应该只使用旧的samlKeystore.jks而不是创建一个新的密钥库。如果使用openssl s_client -connect idp.ssocircle.com:443 -showcerts,可以看到它包含3个项目(原来它有2个)。

我不明白为什么SP从IdP元数据中获取公钥,但仍然需要IdP的ca.cer?我相信来自auth网站的ca.cer是IdP的证书,虽然它与我Error decoding incoming SAML message

的证书不同

此外,现在我没有获得HTTP Status 401 - Authentication Failed: Response issue time is either too old or with date in the future,而是获得gradle

第3天 当我启动SP时,从chrome和firefox访问http://localhost:8080/spring-security-saml2-sample/,当我在一个资源管理器中按下全局注销,然后刷新另一个时,它不显示注销页面。我想SSO,来自同一个SP的全局注销应该忽略多个会话,例如,一旦我在一个“登录”中全局注销,我应该自动注销另一个,我应该看到一个注销页面另一个探险家(如果我刷新)。实际上,对于多个SP,一个我在一个注销,我应该能够在我登录的所有SP中看到注销。

第二天 通过更改saml项目URL,需要修改idp.ssocircle.com中的元数据(管理元数据)。否则,idp网站会显示错误。这是用docs / reference / htmlsingle / index.html

编写的

1 个答案:

答案 0 :(得分:2)

IDP元数据中的证书用于对SAML XML文档进行数字签名。您的故障来自的证书来自www.ssocircle.com的HTTPS端点,您的Spring SAML在工件解析期间调用该端点。这两个证书通常是不同的。

SSOCircle最近更改了为www.ssocircle.com颁发证书的证书颁发机构,SAML ERROR: PKIX path construction failed for untrusted credential中描述的操作是让CA信任。

您的最新错误可能是因为您的Spring SAML计算机没有时间正确同步。