Spring Security 5.7.1 SAML断言签名校验失败 5.4.2版本正常
问题原因
该签名校验错误和现有application.yml中配置的实体ID、证书路径、单点登录地址无关,是Spring Security 5.7版本SAML2模块默认签名校验逻辑变更导致的:
- 5.4.2版本默认仅校验SAML报文内层的
Assertion(断言)节点签名 - 5.7.0及之后版本默认优先校验SAML报文外层的
Response(响应)节点签名,只要外层节点携带签名元素就会强制走校验流程
当前使用的Okta默认SAML配置下,外层响应签名和内层断言签名使用的密钥不一致,或外层响应未做有效签名,就会抛出Invalid signature for object [id6...]错误。
解决方案
两种方案选其一即可,无需全量调整现有配置:
- 兼容旧版本校验逻辑(快速修复)
在现有身份提供商配置块下补充签名校验范围配置,忽略外层响应签名,仅保留断言签名校验:spring: security: saml2: relyingparty: registration: okta-saml: identityprovider: # 原有entity-id、verification、singlesignon配置全部保留 signatures: verify-response-signature: false - 遵循新版本默认安全规则
登录Okta的SAML应用管理后台,下载外层SAML响应对应的签名证书,存入项目资源目录,将该证书补充到校验凭证列表即可:verification: credentials: - certificate-location: "classpath:saml-certificate/okta.crt" # 原有断言签名证书 - certificate-location: "classpath:saml-certificate/okta-response.crt" # 新增响应签名证书
配置修改完成后重启服务,重新发起SAML登录流程即可恢复正常。
内容的提问来源于stack exchange,提问作者ericj
相关产品推荐
相关产品推荐

