Tomcat/ADFS 集成的 Spring SAML 异常

Posted

技术标签:

【中文标题】Tomcat/ADFS 集成的 Spring SAML 异常【英文标题】:Spring SAML exception with Tomcat/ADFS integration 【发布时间】:2016-08-31 13:01:59 【问题描述】:

我下载了 Sprind SAML 示例应用程序,它在我的本地 tomcat 中运行良好(针对 SSOCircle)。然后我添加了一个新的SP指向我们公司的ADFS。我遇到了几个问题并一一解决。现在我能够发送请求并获得有效的 saml 响应和断言令牌。但是我收到以下错误消息:

我确实遵循了一些旧线程(感谢 Vladimír Schäfer)并将公钥导入 samlKeystore.jks,但仍然遇到相同的错误。任何帮助表示赞赏。

错误详情:

规范化的 SignedInfo: QCZQsG03PFbYdFMyX2UaO2rXSXA= 验证 1 个参考文献 不要求我遵循嵌套清单 setElement("ds:Reference", "") setElement("ds:Transforms", "") 请求 URI .w3.org/2000/09/xmldsig#sha1 我被要求创建一个 ResourceResolver 并得到 0 通过类 org.apache.xml.security.utils.resolver.ResourceResolver 检查可解决性 状态我可以解决参考:“#_28691d8f-b0ab-4c19-ad32-4c60fada6e90” 尝试捕获 ID 为 _28691d8f-b0ab-4c19-ad32-4c60fada6e90 且元素为 [Assertion: null] 的元素 setElement("ds:Transform", "") 执行第 (0) 次 .w3.org/2000/09/xmldsig#envelope-signature 转换 setElement("ds:Transform", "") 预消化输入: http://adfs.mycompany.com/adfs/services/trustrobertRYYGWLoginrobertRurn:federation:authentication:windows URI“#_28691d8f-b0ab-4c19-ad32-4c60fada6e90”验证成功 引用具有类型 使用提供的凭据中的密钥验证签名 使用候选凭据的签名验证成功 使用 KeyInfo 派生凭据成功验证签名 正在尝试建立对 KeyInfo 派生凭据的信任 无法根据受信任的密钥验证不受信任的凭据 无法根据受信任的密钥验证不受信任的凭据 无法根据受信任的密钥验证不受信任的凭据 未能建立对 KeyInfo 派生凭据的信任 无法使用任何 KeyInfo 派生凭据验证签名和/或建立信任 尝试使用受信任的凭据验证签名 尝试使用提供的凭据中的密钥验证签名 创建 XMLSignature 对象 使用签名算法 URI 验证签名:.w3.org/2000/09/xmldsig#rsa-sha1 验证凭证密钥算法“RSA”,密钥实例类“sun.security.rsa.RSAPublicKeyImpl” signatureMethodURI = .w3.org/2000/09/xmldsig#rsa-sha1 jceSigAlgorithm = SHA1withRSA jceSigProvider = SunRsaSign PublicKey = Sun RSA 公钥,2048 位 模数:23431177975394 公共指数:65537 规范化的 SignedInfo: QCZQsG03PFbYdFMyX2UaO2rXSXA= 签名验证失败。 签名未针对凭据的密钥进行验证 使用候选验证凭证的签名验证失败 org.opensaml.xml.validation.ValidationException:签名未针对凭证的密钥进行验证 在 org.opensaml.xml.signature.SignatureValidator.validate(SignatureValidator.java:79) 在 org.opensaml.xml.signature.impl.BaseSignatureTrustEngine.verifySignature(BaseSignatureTrustEngine.java:142) 在 org.opensaml.xml.signature.impl.ExplicitKeySignatureTrustEngine.validate(ExplicitKeySignatureTrustEngine.java:110) 在 org.opensaml.xml.signature.impl.ExplicitKeySignatureTrustEngine.validate(ExplicitKeySignatureTrustEngine.java:49) 在 org.springframework.security.saml.websso.AbstractProfileBase.verifySignature(AbstractProfileBase.java:267) 在 org.springframework.security.saml.websso.WebSSOProfileConsumerImpl.verifyAssertionSignature(WebSSOProfileConsumerImpl.java:419) 在 org.springframework.security.saml.websso.WebSSOProfileConsumerImpl.verifyAssertion(WebSSOProfileConsumerImpl.java:292) 在 org.springframework.security.saml.websso.WebSSOProfileConsumerImpl.processAuthenticationResponse(WebSSOProfileConsumerImpl.java:214) 在 org.springframework.security.saml.SAMLAuthenticationProvider.authenticate(SAMLAuthenticationProvider.java:82) 在 org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:156) 在 org.springframework.security.saml.SAMLProcessingFilter.attemptAuthentication(SAMLProcessingFilter.java:84) 在 org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:195) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 在 org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) 在 org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:166) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 在 org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 在 org.springframework.security.saml.metadata.MetadataGeneratorFilter.doFilter(MetadataGeneratorFilter.java:87) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 在 org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) 在 org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) 在 org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) 在 org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:614) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625) 在 org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Thread.java:724) 尝试使用提供的凭据中的密钥验证签名 创建 XMLSignature 对象 使用签名算法 URI 验证签名:.w3.org/2000/09/xmldsig#rsa-sha1 验证凭证密钥算法“RSA”,密钥实例类“sun.security.rsa.RSAPublicKeyImpl” signatureMethodURI = .w3.org/2000/09/xmldsig#rsa-sha1 jceSigAlgorithm = SHA1withRSA jceSigProvider = SunRsaSign PublicKey = Sun RSA 公钥,2048 位 模数:2179836566179054962 公共指数:65537 规范化的 SignedInfo: QCZQsG03PFbYdFMyX2UaO2rXSXA= 签名验证失败。 签名未针对凭据的密钥进行验证 使用候选验证凭证的签名验证失败 org.opensaml.xml.validation.ValidationException:签名未针对凭证的密钥进行验证 在 org.opensaml.xml.signature.SignatureValidator.validate(SignatureValidator.java:79) 在 org.opensaml.xml.signature.impl.BaseSignatureTrustEngine.verifySignature(BaseSignatureTrustEngine.java:142) 在 org.opensaml.xml.signature.impl.ExplicitKeySignatureTrustEngine.validate(ExplicitKeySignatureTrustEngine.java:110) 在 org.opensaml.xml.signature.impl.ExplicitKeySignatureTrustEngine.validate(ExplicitKeySignatureTrustEngine.java:49)

【问题讨论】:

【参考方案1】:

签名验证失败。 签名未针对凭证的密钥进行验证 使用候选验证凭证的签名验证失败 org.opensaml.xml.validation.ValidationException:签名未针对凭证的密钥进行验证

当您尝试使用不同的 publicKey 验证 saml 响应或断言并使用不同的公钥-私钥对进行签名时,会发生此错误。 先验证saml响应签名x509证书和你的idp公证书不一样。

【讨论】:

【参考方案2】:

以下内容可能对您有所帮助, 请确认您的 idp.xml 与您的 IDP/IDP 领域具有相同的公开。确保 IDP 和 Application 在同一 timeZone/Time。

【讨论】:

以上是关于Tomcat/ADFS 集成的 Spring SAML 异常的主要内容,如果未能解决你的问题,请参考以下文章

Sa-Token实现分布式登录鉴权(Redis集成 前后端分离)

软件设计随想-上下游系统集成问题

将 CAS 与外部 SAML 身份提供者集成

Spring Boot中使用Sa-Token实现轻量级登录与鉴权

如何在运行时在 spring-SAML 中添加新的 idp 元数据

SpringBoot:Sa-Token的具体介绍与使用