8

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

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

考虑以下情况。

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

我的问题是:SP 可以验证 CertIdP 仅具有其父证书 CertCA 签名的消息的签名吗?

背景故事,为什么要它。

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

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

由于 CertIdP 和 CertSP 都是由同一个颁发机构 (CA) 颁发的,而 IdP 和 SP 都绝对信任该颁发机构,因此我们想到可以使用 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>
4

3 回答 3

6

这取决于您的 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 的本地密钥库中找不到签名证书,它将联系 Web 服务以检索新的 CertIdP 并将其添加到本地密钥库中。保留本地密钥库与性能、可用​​性和隐私相关。

于 2014-07-23T10:16:53.700 回答
3

我将从一些小介绍开始——数字签名的验证分两个阶段完成

  • 第一次签名验证 - 检查签名值是否实际上与其保护的内容相对应,并且内容因此未被篡改
  • 信任验证 - 检查签名是否由验证者信任的人制作)。

数字签名的验证需要拥有其对应的私钥用于创建签名的公钥。没有办法解决这个问题。

但是有一个用于验证信任的用例,它允许使用 CA 证书 - 它应该对您的情况有所帮助。

它的作用是让您只在为您的 SP 和 IDP 生成的元数据中包含您的 CA(可能还有中间 CA)签名证书。然后,您将用于创建签名的精确叶密钥(由 CA 颁发)作为 SAML 消息的一部分(在签名内的 KeyInfo 元素中)包含在内。然后,SP/IDP 能够通过使用它已经拥有的 CA 证书构建和验证证书路径来验证叶密钥(它事先不知道)是否受信任。

这对于密钥的翻转(例如,当它们过期时)很有用——因为 SP 和 IDP 可以更改其签名密钥而无需通知另一方。SAML 产品有时将此功能称为锚定或 PKIX 信任模式。

请注意,这种方法不适用于数字加密,因为加密需要事先了解对方的精确叶密钥。

于 2014-07-23T17:49:00.023 回答
2

最简洁的答案是不。” 如果您只有 CA 的证书,而没有 IdP 或 SP 的证书,则无法验证 IdP 或 SP 的签名。

更长的答案:为了验证 SP 的 IdP 签名,SP 首先必须识别与 IdP 关联的正确公钥。验证涉及将公钥加密的签名值与内容的哈希值进行比较,并检查它们是否相同。如果没有 IdP 的公钥,SP 无法执行此操作。

假设 SP 有一个使上述验证工作的公钥,并且它现在想要验证这个公钥实际上属于 IdP。为此,它需要一个包含公钥和 IdP 名称的证书,并带有来自受信任实体(在本例中为 CA)的签名。由于您没有此权限,因此您无法验证签名是否由 IdP 执行。

于 2014-07-25T21:07:15.357 回答