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

Spring Security SAML-验证签名失败

周朗
2023-03-14

我在Tomcat 7上使用Spring Security SAML 2.0示例webapp,并对其进行了修改,以尝试让其通过Ping身份验证服务。webapp正在与服务对话,并返回一个断言,但在尝试验证签名时失败,如下调试输出所示:

- Attempting to verify signature and establish trust using KeyInfo-derived credentials
- Signature contained no KeyInfo element, could not resolve verification credentials
- Failed to verify signature and/or establish trust using any KeyInfo-derived credentials
- Attempting to verify signature using trusted credentials
- Failed to verify signature using either KeyInfo-derived or directly trusted credentials
- Validation of received assertion failed, assertion will be skipped
org.opensaml.xml.validation.ValidationException: Signature is not trusted or invalid

我知道它无法验证签名,并且我已经获得了ping身份管理员要使用的证书,但我不确定如何将其包含在应用程序中。我尝试过使用JDK的keytools程序将其添加到示例应用程序附带的JKS(keystore)中,但似乎在那里找不到它。我还尝试过将其添加到服务提供商的元数据xml文件中,如下所示:

<md:KeyDescriptor use="signing">
    <ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:X509Data>
            <ds:X509Certificate>
                [Certificate is here...]
            </ds:X509Certificate>
        </ds:X509Data>
    </ds:KeyInfo>
</md:KeyDescriptor>

但是它仍然返回相同的错误。

为了验证签名,我应该将证书放在特定的位置吗?一般来说,我对SAML和应用程序安全性相对较陌生,因此如果我使用了错误的术语,我道歉。

共有1个答案

白星腾
2023-03-14

终于让这个工作了。原来我错过了安全上下文文件中的一行配置,并且(看起来)服务提供商的元数据XML文件中不需要X509证书定义。

基本上,我已经将提供给我的公钥导入了现有的JKS(使用keytool),但我没有告诉应用程序具体使用它。为了做到这一点,我必须进入安全上下文文件(在我的例子中是“securityContext.xml”),并在SP的元数据xml文件的ExtendedMetadatabean定义中添加以下行:

<property name="signingKey" value="[alias of the provided key in the JKS goes here]"/>

因此,在这次修改之后,ExtendedMetadataDelegatebean定义如下:

<bean class="org.springframework.security.saml.metadata.ExtendedMetadataDelegate">
  <constructor-arg>
    <bean class="org.opensaml.saml2.metadata.provider.FilesystemMetadataProvider">
      <constructor-arg>
        <value type="java.io.File">classpath:security/[Path to SP metadata xml file].xml</value>
      </constructor-arg>
      <property name="parserPool" ref="parserPool" />
    </bean>
  </constructor-arg>
  <constructor-arg>
    <bean class="org.springframework.security.saml.metadata.ExtendedMetadata">
      <property name="alias" value="[SP alias goes here]" />
      <property name="signingKey" value="[alias of the provided key in the JKS goes here]"/>
    </bean>
  </constructor-arg>
</bean>

希望这能帮助任何可能处于类似情况的人。

 类似资料:
  • 我有一个电子签名/数字签名的PDF,该文档在分离签名中使用iText lib进行签名。我在验证签名时遇到问题,收到消息“签名者身份无效,因为它已过期或尚未有效”,并且在签名者信息中“构建从签名者证书到颁发者证书的路径时出错。” 我尝试了很多方法来验证签名,但都没有成功。如果我明确地将签名者证书添加为可信证书,那么我会得到一个绿色检查,并能够验证签名,但我认为这不是正确的方法。 数字签名的pdf可以

  • 我试图使用Terraform创建一个自签名证书,以便在测试/开发环境中内部使用。 我首先创建一个CA私钥,自签名证书。 然后,为要启用HTTPS的内部域名创建证书签名请求和私钥。 然后我在证书上签字。以下是我使用的整个Terraform清单: 我查了Terraform舱单。然后我从状态文件中提取生成的证书并将它们保存到文件中。 我试图用openssl验证最终证书,但得到一个错误: 你知道问题出在哪

  • 2016年8月1日11:34:39 AM org.apache.catalina.core.standardWrapperValve在路径为[/travelocity.com]的上下文中为servlet[jsp]调用严重:servlet.service()引发了异常[SAML响应的签名验证失败],根本原因为org.wso2.carbon.identity.sso.agent.exception.s

  • 问题内容: 我正在努力验证Azure AD令牌签名。 当我在下面的“ jwks_uri”字段中查找正确的键描述时 https://login.microsoftonline.com/common/.well-known/openid- configuration 我检查所属密钥数据。 我尝试使用“ n”-模数和“ e”字段生成用于签名验证的公钥,但最终出现错误: 安慰: 我尝试了另一种使用“ x5

  • 当我重新启动identityserver4客户端应用程序第一次获得异常时,我使用identityserver4处理SSO问题 因此,我将更改为但在重新启动identityserver时仍然会出现错误

  • 问题内容: 我正在尝试以编程方式验证jar文件是否未被明显篡改。我有2个要防止的用例。1)修改现有类2)在罐子中添加新类 我使用jarsigner签名了罐子。当我用jarsigner验证以上两种情况之一时,它的工作方式就与我期望的一样。 当我尝试使用如何以编程方式验证用jarsigner签名的jar 或如何通过自签名的jar验证签名中的示例以编程方式进行操作时 ?但是,我没有任何SecurityE