当前位置: 首页 > 知识库问答 >
问题:

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

佴德曜
2023-03-14

我做了spring saml教程中描述的所有事情,除了添加

<dependency>
    <groupId>xml-apis</groupId>
    <artifactId>xml-apis</artifactId>
    <version>1.4.01</version>
</dependency>

在pom.xml中克服一个W3.DOM类找不到的问题。当我运行示例项目时,我在浏览器中得到HTTP状态401-身份验证失败:错误解码传入SAML消息,同时(CertPathPkixTrusteValuator.java:81)错误org.springframework.security.SAML.trust.MetadataCredentialResolver-不受信任凭据的PKIX路径构造失败:[subjectName='cn=idp.ssocircle.com'credential Entityid='https://idp.ssocircle.com']:在控制台中找不到请求目标的有效证书路径

第2天:运行keytool-importcert-alias identtrustca-file ca.cer-keystore samlkeystore.jks,并将security/samlkeystore.jks替换为新生成的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>
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

我不明白为什么SP从IdP元数据中获得公钥,却仍然需要IdP的ca.cer?我相信来自auth网站的ca.cer是IDP的证书,尽管它不同于我通过openssl s_client-connect idp.ssocircle.com:443-showcerts获得的证书

而且,现在不是得到错误解码传入SAML消息而是得到HTTP状态401-身份验证失败:响应问题时间太早或日期在将来

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

通过更改saml项目url,您需要修改idp.ssocircle.com(manage metadata)中的元数据。否则,idp网站将显示错误。这是用docs/reference/htmlsingle/index.html编写的

共有1个答案

温嘉玉
2023-03-14

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

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

您最近的错误可能是由于Spring SAML机器上的时间没有正确同步造成的。

 类似资料: