certificate - 在没有中间证书的情况下验证签名

标签 certificate saml saml-2.0 digital-certificate picketlink

是否可以验证仅在层次结构中具有祖先或根证书的签名?

免责声明:我是证书处理的新手,所以请原谅幼稚的术语。

考虑以下情况。

  • 我们有两方(让我们称它们为 IdP 用于身份提供商和 SP 用于服务提供商)和一些中央证书颁发机构 CA IdP 和 SP 绝对信任。
  • CA 有自己的证书 CertCA IdP 和 SP 都知道(以某个别名导入 IdP 和 SP 的 keystore )
  • 出 CA 为 IdP ( CertIdP ) 颁发一份证书,为 SP ( CertSP ) 颁发一份证书。
  • IdP 在其 keystore 中有 CertIdP 并且知道它的密码,因此 IdP 可以使用 CertIdP 签署消息
  • SP/CertSP 相同
  • 现在让我们假设 SP 不知道 CertIdP 并且 IdP 不知道 CertSP。他们只知道用于签署 CertIdP 和 CertSP 的 CertCA。 (据我所知,我们有一个证书层次结构 CertIdP --> CertCA <-- CertSP here-)
  • IdP 想要向 SP 发送签名消息。它创建一条消息,然后使用 CertIdP 对其进行签名。
  • SP 使用 CertIdP 接收由 IdP 签名的消息。如上所述,SP 没有 CertIdP,只有父证书 CertCA。

  • 我的问题是: SP 是否可以仅通过其父证书 CertCA 验证由 CertIdP 签署的消息的签名?

    背景故事,为什么要它。

    我们正在使用 PicketLink 实现基于 SAML 的 SSO。我们正在使用 PicketLink 的 SAML2SignatureValidationHandler验证签名。为了实现这一点,服务提供商 (SP) 需要在其 keystore 中拥有 IdP 的证书。当签名的 SAML 断言传递给 SP 时,此处理程序使用 IdP 的证书来验证签名。

    上述过程运行良好,但我们有一些组织方面的问题。此过程假定 SP 具有 IdP 的验证证书。万一发生变化,必须在 SP 端更换 IdP 的证书。我们可能有大量的 SP(数百而不是数千),所以这是一项相当大的努力。

    由于 CertIdP 和 CertSP 均由 IdP 和 SP 绝对信任的同一机构 (CA) 颁发,因此我们想到可以使用 CA 的证书进行签名验证。如果这可行,这可能会消除在 IdP 和 SP 之间交换证书的需要。 CA 的证书也非常“长效”,所以只要在永恒中交换一次(永恒,在我们的例子中大约是 10-20 年)。

    但是,我不确定在技术上是否可以验证仅具有父 CertCA 的 CertIdP 签名的签名。是否可以?或者我们在这里完全错误的轨道?

    如果相关,我们在 SP 端的 Java/JBoss 平台上,IdP 是第三方软件。

    更新:

    这是我目前从 IdP 得到的签名:
        <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
            <ds:SignedInfo>
                <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
                <ds:Reference URI="#_...">
                    <ds:Transforms>
                        <ds:Transform
                            Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
                        <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
                            <ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"
                                PrefixList="ds saml samlp" />
                        </ds:Transform>
                    </ds:Transforms>
                    <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                    <ds:DigestValue>r...=</ds:DigestValue>
                </ds:Reference>
            </ds:SignedInfo>
            <ds:SignatureValue>X...==</ds:SignatureValue>
        </ds:Signature>
    

    最佳答案

    这取决于您的 SAML 响应是否包含签名证书 <ds:X509Data>...</ds:X509Data>或者只是公钥<ds:KeyValue>...</ds:KeyValue>其中。

    <saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" ...>
      ...
      <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:SignedInfo>...</ds:SignedInfo
        <ds:SignatureValue>...</ds:SignatureValue>
        <ds:KeyInfo>
          <ds:X509Data>
            <ds:X509Certificate>...</ds:X509Certificate>
          </ds:X509Data>
        </ds:KeyInfo>
      </ds:Signature>
    </saml2p:Response>
    

    对比
    <saml2p:Response xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" ...>
      ...
      <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
        <ds:SignedInfo>...</ds:SignedInfo
        <ds:SignatureValue>...</ds:SignatureValue>
        <ds:KeyInfo>
          <ds:KeyValue>
            <ds:RSAKeyValue>
              <ds:Modulus>...</ds:Modulus>
              <ds:Exponent>...</ds:Exponent>
            </ds:RSAKeyValue>
          </ds:KeyValue>
        </ds:KeyInfo>
      </ds:Signature>
    </saml2p:Response>
    

    如果嵌入了签名证书,则它可能包含 AuthorityInfoAccess 扩展,该扩展通常包含指向颁发 CA 证书的 http 或 ldap URL。使用这些从签名证书到可信 CA 证书的扩展,您将能够构建可信证书链。 (注意:如果 CertCA 实际上是 CertIdP 和 CertSP 的直接颁发者,则您已经拥有所需的可信证书链。)

    但是,如果您只获得了公钥,则需要手头有签名证书来匹配公钥。那么它归结为配置/分发问题。您可以提供一个 Web 服务,为请求的公钥返回相应的签名证书。如果在 SP 的本地 keystore 中找不到签名证书,它将联系 Web 服务以检索新的 CertIdP 并将其添加到本地 keystore 。保持本地 keystore 与性能、可用​​性和隐私相关。

    关于certificate - 在没有中间证书的情况下验证签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24905170/

    相关文章:

    ios - 证书是否与 iOS 中的配置文件相关?

    version-control - teamcity 中的 mercurial VCS 证书验证失败

    certificate - 制作自己的文件签名证书?

    authentication - 通过 PingFederate 对启用单点登录的服务进行脚本访问

    firefox - 客户端证书和 FireFox

    saml - 如何配置 ADFS 以便指示应签署身份验证请求

    curl - 使用 cURL 对 SharePoint Online 进行身份验证(使用 ADFS 2.1 作为 IP-STS)

    saml - 在 SAML 响应中,我们应该签署响应还是断言

    restful-authentication - 针对 SAML IDP 对移动用户进行身份验证

    java - 我可以在不将服务提供商注册到 IDp 的情况下向 IDp 发送 SAML 请求吗