问题标签 [spring-saml]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
14753 浏览

java - Spring Security SAML 实现

我从计划使用 SSO 的新 Spring 项目开始。我已经把博客弄红了,并且知道 Spring Security SAML 将是 SP 的最佳解决方案。

所以我已经实现了 Spring 站点https://github.com/SpringSource/spring-security-saml提供的 Spring Security SAML 示例应用程序作为 SP 以及 Shibboleth IDP。

IDP 与 LDAP 服务器连接。我能够执行 Spring 安全示例应用程序。

我很困惑如何将这个 Spring 安全 SAML 扩展与多个 Spring 项目一起使用。

任何有关将 Spring SAML 项目与多个 Spring MVC 应用程序集成的示例链接或建议都会有所帮助。

0 投票
1 回答
1622 浏览

spring - Spring SAML - 如何在 SP HTTP 请求中添加自定义字段?

我的服务提供商使用 HTTP-Post 绑定将请求发送到 IDP。我需要在表单中添加新字段。现在我正在发送“SAMLRequest”和“RelayState”,但我还需要发送“option”和“profile”,这些是我们的 IDP 所需的字段。如何使用 Spring Saml 安全性来实现这一点?

0 投票
2 回答
1662 浏览

java - 在 Weblogic 12c 上部署 Spring Security SAML 扩展的问题

我正在尝试在 Weblogic 12c 上部署示例应用程序。我可以在 Tomcat 中很好地运行它,但是当我尝试将它部署到 Weblogic 时,我收到以下错误:

严重:上下文初始化失败 java.lang.NoClassDefFoundError: org/apache/log4j/Logger

我检查了 pom.xml,我知道 log4j 包含在依赖项中。这是堆栈跟踪:

严重:上下文初始化失败 java.lang.NoClassDefFoundError: org.opensaml.xml.XMLConfigurator.(XMLConfigurator.java:60) 处 org.opensaml.DefaultBootstrap.initializeXMLTooling(DefaultBootstrap.java:195) 处的 org/apache/log4j/Logger org.opensaml.DefaultBootstrap.bootstrap(DefaultBootstrap.java:91) at org.opensaml.PaosBootstrap.bootstrap(PaosBootstrap.java:27) at org.springframework.security.saml.SAMLBootstrap.postProcessBeanFactory(SAMLBootstrap.java:42) at org .springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:686) 在 org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:676) 在 org.springframework.context.support.AbstractApplicationContext。refresh(AbstractApplicationContext.java:451) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:383) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283) at org.springframework .web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111) 在 weblogic.servlet.internal.EventsManager$FireContextListenerAction.run(EventsManager.java:678) 在 weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java :321) 在 weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57) 在 weblogic.servlet.internal.EventsManager.executeContextListener(EventsManager.爪哇:243) 在 weblogic.servlet.internal.EventsManager.notifyContextCreatedEvent(EventsManager.java:200) 在 weblogic.servlet.internal.EventsManager.notifyContextCreatedEvent(EventsManager.java:185) 在 weblogic.servlet.internal.WebAppServletContext.preloadResources(WebAppServletContext.java :1838) 在 weblogic.servlet.internal.WebAppServletContext.start(WebAppServletContext.java:2876) 在 weblogic.servlet.internal.WebAppModule.startContexts(WebAppModule.java:1661) 在 weblogic.servlet.internal.WebAppModule.start(WebAppModule. java:823) 在 weblogic.application.internal.ExtensibleModuleWrapper$StartStateChange.next(ExtensibleModuleWrapper.java:360) 在 weblogic.application.internal.ExtensibleModuleWrapper$StartStateChange.next(ExtensibleModuleWrapper.java:356) 在 weblogic.application.utils.StateMachineDriver .nextState(StateMachineDriver.java:42) 在 weblogic.application.internal.ExtensibleModuleWrapper.start(ExtensibleModuleWrapper.java:138) 在 weblogic.application.internal.flow.ModuleListenerInvoker.start(ModuleListenerInvoker.java:124) 在 weblogic.application.internal .flow.ModuleStateDriver$3.next(ModuleStateDriver.java:216) 在 weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:211) 在 weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:42) ) 在 weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:73) 在 weblogic.application.internal.flow.StartModulesFlow.activate(StartModulesFlow.java:24) 在 weblogic.application.internal.BaseDeployment$2.next (BaseDeployment.java:729) 在 weblogic.application.utils。StateMachineDriver.nextState(StateMachineDriver.java:42) 在 weblogic.application.internal.BaseDeployment.activate(BaseDeployment.java:258) 在 weblogic.application.internal.EarDeployment.activate(EarDeployment.java:61) 在 weblogic.application.internal .DeploymentStateChecker.activate(DeploymentStateChecker.java:165) 在 weblogic.deploy.internal.targetserver.AppContainerInvoker.activate(AppContainerInvoker.java:80) 在 weblogic.deploy.internal.targetserver.BasicDeployment.activate(BasicDeployment.java:226) 在weblogic.deploy.internal.targetserver.BasicDeployment.activateFromServerLifecycle(BasicDeployment.java:418) 在 weblogic.management.deploy.internal.DeploymentAdapter$1.doActivate(DeploymentAdapter.java:51) 在 weblogic.management.deploy.internal.DeploymentAdapter.activate (部署适配器.java:200) 在 weblogic.management.deploy.internal.AppTransition$2.transitionApp(AppTransition.java:30) 在 weblogic.management.deploy.internal.ConfiguredDeployments.transitionApps(ConfiguredDeployments.java:240) 在 weblogic.management.deploy.internal。 ConfiguredDeployments.activate(ConfiguredDeployments.java:169) 在 weblogic.management.deploy.internal.ConfiguredDeployments.deploy(ConfiguredDeployments.java:123) 在 weblogic.management.deploy.internal.DeploymentServerService.resume(DeploymentServerService.java:210) 在 weblogic .management.deploy.internal.DeploymentServerService.start(DeploymentServerService.java:118) 在 weblogic.server.AbstractServerService.postConstruct(AbstractServerService.java:78) 在 sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) 在 sun.reflect.DelegatingMethodAccessorImpl .在 org.glassfish.hk2.utilities.reflection.ReflectionHelper.invoke(ReflectionHelper.java:1017) 在 org.jvnet 的 java.lang.reflect.Method.invoke(Method.java:606) 调用(DelegatingMethodAccessorImpl.java:43) .hk2.internal.ClazzCreator.postConstructMe(ClazzCreator.java:388) at org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:430) at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java :456) org.glassfish.hk2.runlevel.internal.AsyncRunLevelContext.findOrCreate(AsyncRunLevelContext.java:225) org.glassfish.hk2.runlevel.RunLevelContext.findOrCreate(RunLevelContext.java:82) org.jvnet.hk2。 internal.Utilities.createService(Utilities.java:2488) 在 org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:98) 在 org.jvnet.hk2.internal.ServiceLocatorImpl。getService(ServiceLocatorImpl.java:606) at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:77) at org.jvnet.hk2.internal.ClazzCreator.resolve(ClazzCreator.java:231) at org.jvnet .hk2.internal.ClazzCreator.resolveAllDependencies(ClazzCreator.java:254) 在 org.jvnet.hk2.internal.ClazzCreator.create(ClazzCreator.java:413) 在 org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java :456) org.glassfish.hk2.runlevel.internal.AsyncRunLevelContext.findOrCreate(AsyncRunLevelContext.java:225) org.glassfish.hk2.runlevel.RunLevelContext.findOrCreate(RunLevelContext.java:82) org.jvnet.hk2。 internal.Utilities.createService(Utilities.java:2488) 在 org.jvnet.hk2.internal.ServiceHandleImpl.getService(ServiceHandleImpl.java:98) 在 org.jvnet.hk2.internal。ServiceHandleImpl.getService(ServiceHandleImpl.java:87) at org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.oneJob(CurrentTaskFuture.java:1162) at org.glassfish.hk2.runlevel.internal.CurrentTaskFuture$QueueRunner.run( CurrentTaskFuture.java:1147) 在 weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:548) 在 weblogic.work.ExecuteThread.execute(ExecuteThread.java:311) 在 weblogic.work.ExecuteThread.run(ExecuteThread.java :263) 原因:java.lang.ClassNotFoundException: org.apache.log4j.Logger at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355 ) 在 java.lang 的 java.net.URLClassLoader.findClass(URLClassLoader.java:354) 的 java.security.AccessController.doPrivileged(Native Method)。ClassLoader.loadClass(ClassLoader.java:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) ... 76 更多

(XMLConfigurator.java:60) 在 org.opensaml.DefaultBootstrap.initializeXMLTooling(DefaultBootstrap.java:195) 在 org.opensaml.DefaultBootstrap.bootstrap(DefaultBootstrap.java:91) 在 org.opensaml.PaosBootstrap.bootstrap(PaosBootstrap.java: 27) 在 org.springframework.security.saml.SAMLBootstrap.postProcessBeanFactory(SAMLBootstrap.java:42) 被截断。请参阅日志文件以获取完整的堆栈跟踪 原因:java.net.URLClassLoader$1.run(URLClassLoader.java:366) 上的 java.net.URLClassLoader$1.run(URLClassLoader.run(URLClassLoader. java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 被截断。查看日志文件以获取完整的堆栈跟踪

(XMLConfigurator.java:60) 在 org.opensaml.DefaultBootstrap.initializeXMLTooling(DefaultBootstrap.java:195) 在 org.opensaml.DefaultBootstrap.bootstrap(DefaultBootstrap.java:91) 在 org.opensaml.PaosBootstrap.bootstrap(PaosBootstrap.java: 27) 在 org.springframework.security.saml.SAMLBootstrap.postProcessBeanFactory(SAMLBootstrap.java:42) 被截断。请参阅日志文件以获取完整的堆栈跟踪 原因:java.net.URLClassLoader$1.run(URLClassLoader.java:366) 上的 java.net.URLClassLoader$1.run(URLClassLoader.run(URLClassLoader. java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 被截断。请参阅 org.opensaml.DefaultBootstrap.bootstrap(DefaultBootstrap.java:91) 的 org.opensaml.PaosBootstrap 的 org.opensaml.DefaultBootstrap.initializeXMLTooling(DefaultBootstrap.java:195) 的完整堆栈跟踪 (XMLConfigurator.java:60) 的日志文件。 bootstrap(PaosBootstrap.java:27) 在 org.springframework.security.saml.SAMLBootstrap.postProcessBeanFactory(SAMLBootstrap.java:42) 被截断。请参阅日志文件以获取完整的堆栈跟踪 原因:java.net.URLClassLoader$1.run(URLClassLoader.java:366) 上的 java.net.URLClassLoader$1.run(URLClassLoader.run(URLClassLoader. java:355) 在 java.security.AccessController.doPrivileged(Native Method) 在 java.net.URLClassLoader.findClass(URLClassLoader.java:354) 在 java.lang.ClassLoader。loadClass(ClassLoader.java:425) 被截断。查看完整堆栈跟踪的日志文件 2014 年 9 月 5 日上午 11:20:17 org.springframework.web.servlet.FrameworkServlet initServletBean 信息:FrameworkServlet 'saml':在 org.opensaml.DefaultBootstrap.initializeXMLTooling 开始初始化 (XMLConfigurator.java:60) (DefaultBootstrap.java:195) 在 org.opensaml.DefaultBootstrap.bootstrap(DefaultBootstrap.java:91) 在 org.opensaml.PaosBootstrap.bootstrap(PaosBootstrap.java:27) 在 org.springframework.security.saml.SAMLBootstrap.postProcessBeanFactory( SAMLBootstrap.java:42) 被截断。请参阅日志文件以获取完整的堆栈跟踪原因:java.net.URLClassLoader$1.run(URLClassLoader.java:366) 上的 java.net.URLClassLoader$1 上的 java.lang.ClassNotFoundException: org.apache.log4j.Logger。在 java.net.URLClassLoader.findClass(URLClassLoader.java:354) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:425) 的 java.security.AccessController.doPrivileged(Native Method) 运行(URLClassLoader.java:355)截断。查看日志文件以获取完整的堆栈跟踪

任何想法为什么这会在 Weblogic 上轰炸?提前致谢!

0 投票
1 回答
1041 浏览

spring-saml - Spring SAML ServletException

我创建了 Spring Security SAML 示例应用程序的 weblogic 12c 版本。当我尝试运行它时,我收到以下错误:

]] ServletException 的根本原因。weblogic.servlet.jsp.CompilationException:无法编译 JSP /WEB-INF/security/idpSelection.jsp idpSelection.jsp:1:1:验证器类:“org.apache.taglibs.standard.tlv.JstlCoreTLV”失败以下异常:“java.lang.ClassCastException:weblogic.xml.jaxp.RegistrySAXParserFactory 无法转换为 javax.xml.parsers.SAXParserFactory”。<%@ page ^-------- import="org.springframework.security.saml.metadata.MetadataManager"%> --------- -------------------------------------------------- -----^

在 weblogic.servlet.jsp.JavelinxJSPStub.reportCompilationErrorIfNeccessary(JavelinxJSPStub.java:244) 在 weblogic.servlet.jsp.JavelinxJSPStub.compilePage0(JavelinxJSPStub.java:180) 在 weblogic.servlet.jsp.JavelinxJSPStub.access$000(JavelinxJSPStub.java: 50) 在 weblogic.servlet.jsp.JavelinxJSPStub$1.run(JavelinxJSPStub.java:108) 在 java.security.AccessController.doPrivileged(Native Method) 被截断。查看日志文件以获取完整的堆栈跟踪

<[ServletContext@11256322[app:_auto_generated_ear_ module:SAML2Sample path:null spec-version:3.0]] 提供错误页面时出现问题。javax.servlet.ServletException:weblogic.servlet.jsp.CompilationException:无法编译 JSP /error.jsp error.jsp:1:1:验证器类:“org.apache.taglibs.standard.tlv.JstlCoreTLV”失败以下异常:“java.lang.ClassCastException:weblogic.xml.jaxp.RegistrySAXParserFactory 无法转换为 javax.xml.parsers.SAXParserFactory”。<%@ page import="java.io.StringWriter" %>

^----------------------------------------------------^

在 weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:306) 在 weblogic.servlet.internal.ServletStubImpl.onAddToMapException(ServletStubImpl.java:483) 在 weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:372) ) 在 weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:243) 在 weblogic.servlet.internal.RequestDispatcherImpl.invokeServlet(RequestDispatcherImpl.java:587) 被截断。请参阅日志文件以获取完整的堆栈跟踪原因:weblogic.servlet.jsp.CompilationException:无法编译 JSP /error.jsp error.jsp:1:1:验证器类:“org.apache.taglibs.standard.tlv.JstlCoreTLV”失败并出现以下异常:“java.lang.ClassCastException:weblogic.xml.jaxp.RegistrySAXParserFactory 无法转换为 javax.xml.parsers。

^----------------------------------------------------^

在 weblogic.servlet.jsp.JavelinxJSPStub.reportCompilationErrorIfNeccessary(JavelinxJSPStub.java:244) 在 weblogic.servlet.jsp.JavelinxJSPStub.compilePage0(JavelinxJSPStub.java:180) 在 weblogic.servlet.jsp.JavelinxJSPStub.access$000(JavelinxJSPStub.java: 50) 在 weblogic.servlet.jsp.JavelinxJSPStub$1.run(JavelinxJSPStub.java:108) 在 java.security.AccessController.doPrivileged(Native Method) 被截断。查看日志文件以获取完整的堆栈跟踪 >

关于导致 CompilationException 的任何想法?谢谢!

0 投票
1 回答
69 浏览

saml - 签名 SAML IdP 元数据的用例是什么?

在初始元数据交换之外,签署元数据是否有用?跳过签名检查签名有什么风险?

0 投票
1 回答
2851 浏览

spring-security - 将 SP 元数据导入 SSOCircle Spring Security SAML 扩展的问题

我正在运行 Spring Security SAML Extension 示例程序,并且能够生成服务提供者元数据。但是,当我尝试将 SP 元数据导入 SSOCircle 时,出现以下错误:

元数据导入

您的数据无法导入原因:

DefaultValidationEventHandler:[FATAL_ERROR]:元素意外结束 {urn:oasis:names:tc:SAML:2.0:metadata}:扩展位置:第 4 行 领域“/”下的实体描述符“localhost”具有无效语法。

我尝试按照这篇文章中的建议进行操作,但是当我关闭发现时,它不再显示页面并显示 SSOCircle 并显示:发生错误原因:SAML 请求无效。

关于我做错了什么的任何想法?顺便说一句,我使用的是 SAML 扩展的 1.0.0.RELEASE 版本。

谢谢!

0 投票
1 回答
529 浏览

spring-saml - 需要 Spring SAML 服务提供者的加密断言

我正在使用 Spring SAML 并配置了一个接受加密断言的服务提供者。有没有办法配置 SP 以拒绝未加密的断言?

0 投票
1 回答
724 浏览

spring - 使用 Spring SAML Extension 实现身份联合

我们正在尝试使用 Spring SAML Extension 来实现身份联合,这是安全断言标记语言 (SAML) V2.0 技术概述(5.4.3 使用持久假名标识符的联合)中描述的用例。

我们的应用程序尝试将远程用户与业务合作伙伴之间的 SSO 的本地帐户(在应用程序中)相关联。我们的申请是 SP,合作伙伴的申请是 IDP。

在这种情况下,如果用户尝试访问安全资源并且在我们的应用程序上没有登录会话,SP 会将用户重定向到 IDP。在 IDP 站点对用户进行身份验证后,将向 SP 断言消费者服务发送一个带有名称标识符的 HTTP 请求。在 SP 站点,如果名称标识符未映射到本地帐户,我们的应用程序将显示一个登录页面,要求用户提供我们应用程序的本地身份。在用户提供有效凭证之后,将创建一个本地会话,并且用户可以访问安全资源。还创建并保留了两个帐户(SP 和 IDP)的联合。

我搜索了很多示例,但没有找到清楚描述我需要的配置。我还没有找到描述如何实现这一点的 Spring 文档。

基本上,我的问题是如何创建/配置自定义登录屏幕并保持此身份联合。有什么想法、例子或文件吗?

顺便说一句,这与 Ping 联合中的帐户链接非常相​​似。

感谢您的帮助,非常感谢。

0 投票
3 回答
7428 浏览

spring-security - 设置 ExtendedMetadata 'signingAlgorithm' 字段

我在获取 Spring SAML 集成以为我的 IdP 生成正确的元数据文件时遇到问题。我获得了新的 SHA256 SSL 证书。我已经完成了所有步骤来创建适当的 keyStore 并设置了我的 Spring 安全配置文件。从字面上看,我已经完成了 98% 的工作,但是生成的元数据文件中缺少一件事,我终其一生都无法弄清楚为什么它没有被设置。

这是 MetadataGeneratorFilter 的 ExtendedMetadata 配置:

当我运行我的应用程序并转到 /saml/metadata URI 以让 Spring 生成我需要发送到我的 IdP 的元数据文件时,SHA256 算法在 SignatureMethod 上得到正确设置,但子 DigestMethod 标记的算法值仍然设置到 SHA1,当我需要将 ALSO 设置为 SHA256 以及 DigestValue 为 SHA256 值而不是 SHA1 值时。

有人可以指导我如何/我需要设置什么才能将 DigestMethod 算法值也设置为 256?我想,因为它是 SignedInfo 标记的子项,它会从 Extendedmetadata 配置继承 signingAlgorithm 值,但可惜不是。

任何帮助将不胜感激。非常感谢。

解决方案 - 如果有人关心

所以,经过一天的挖掘,我决定自己实现这个。我通过添加字段 digestMethodAlgorithm 扩展了 ExtendedMetadata 类,并添加了适当的 getter/setter:

然后我从上面修改了我的 spring 安全配置,将这个新的 bean 属性包含在我的 MetadataGenerator 配置中:

然后我还必须对 SAMLUtil 类进行两次更改。在 getmetadataAsString 中,在 isSignMetadata() if 子句中,我提取了上面配置设置的 digestMethodAlgorithm 的注入值,然后进一步修改了 marshallAndSignMessage 方法以接受一个新的输入参数,我进一步使用它来正确设置 DigestMethod 算法.

在 SAMLUtil.getMetaDataAsString 内部,第 572 行

在 SAMLUtil.marshallAndSignMessage 内部,就在第 437 行之后,我添加/更改了以下内容:

我通过 Gradle 重新编译了整个 Spring SAML 核心包 spring-security-saml-1.0.0.RELEASE,将新 jar 从 build/libs 目录复制到我的项目,部署了 webapp,将我的浏览器指向 /saml/metadata 和成功获得了元数据文件中正确的 SHA256 签名部分的元数据文件。

我将看看我能做些什么来将它提交给这个项目的 git 存储库,因为我不想失去这个能力,因为这个项目会在未来的版本中发布。以前从未为这样的开源项目做出过贡献。

0 投票
1 回答
5790 浏览

spring-security - Spring Security SAML 可信证书条目不受密码保护

我正在将 spring-saml2-sample 应用程序集成到我自己的应用程序中。我的服务提供商连接到 Shibboleth IDP。我正在使用 Spring Security SAML 应用程序附带的 samlKeystore.jks 中提供的私有证书测试 SP。我使用以下命令在密钥库中注册了 IDP 签名公钥:keytool -importcert -alias idpSignKey -keypass passwordS -file key.cer -keystore samlKeystore.jks

我能够运行应用程序并使用 IDP 登录。我可以在日志中看到,他们在 saml 消息中发回给我的公共证书与我在 idp 元数据中拥有并在密钥库中注册的证书相对应。我的应用程序在从 JKSKeyManager 获取 idp 凭据时中断。

java.lang.UnsupportedOperationException:受信任的证书条目不受密码保护 java.security.KeyStoreSpi.engineGetEntry(Unknown Source) java.security.KeyStore.getEntry(Unknown Source) org.opensaml.xml.security.credential.KeyStoreCredentialResolver.resolveFromSource( KeyStoreCredentialResolver.java:132) org.opensaml.xml.security.credential.AbstractCriteriaFilteringCredentialResolver.resolve(AbstractCriteriaFilteringCredentialResolver.java:57) org.opensaml.xml.security.credential.AbstractCredentialResolver.resolveSingle(AbstractCredentialResolver.java:30) org.opensaml. xml.security.credential.AbstractCredentialResolver.resolveSingle(AbstractCredentialResolver.java:26) org.springframework.security.saml.key.JKSKeyManager.resolveSingle(JKSKeyManager.java:172) org.springframework.security.saml.key。JKSKeyManager.getCredential(JKSKeyManager.java:194) org.springframework.security.saml.trust.MetadataCredentialResolver.retrieveFromMetadata(MetadataCredentialResolver.java:102) org.opensaml.security.MetadataCredentialResolver.resolveFromSource(MetadataCredentialResolver.java:169)

这是 KeyManager 在 contextSecurity.xml 中的外观:

<!-- Central storage of cryptographic keys --> <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"/> <entry key="idpSignKey" value="passwordS"/> <entry key="idpEncKey" value="passwordE"/> </map> </constructor-arg> <constructor-arg type="java.lang.String" value="apollo"/> </bean>

这是 idp 的扩展元数据:

<bean class="org.springframework.security.saml.metadata.ExtendedMetadata"> <property name="local" value="false"/> <property name="securityProfile" value="metaiop"/> <property name="sslSecurityProfile" value="pkix"/> <property name="signingKey" value="idpSignKey"/> <property name="encryptionKey" value="idpEncKey"/> <property name="requireArtifactResolveSigned" value="false"/> <property name="requireLogoutRequestSigned" value="false"/> <property name="requireLogoutResponseSigned" value="false"/> <property name="idpDiscoveryEnabled" value="false"/> </bean>