验证没有中间证书的签名

时间:2014-07-23 08:15:54

标签: certificate saml saml-2.0 digital-certificate picketlink

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

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

考虑以下情况。

  • 我们有两方(让我们称其为 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使用CertIdP接收IdP签名的消息。如上所述,SP没有CertIdP,只有父证书CertCA。

我的问题是: SP是否可以验证CertIdP签名的邮件的签名,只有其父证书CertCA?

背景故事,为什么要这样。

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

上述过程运作良好,但我们有一些组织问题。此过程假定SP具有IdP的验证证书。如果出现问题,必须在SP端更换IdP的证书。我们可能会有大量的SP(当数不是数千时就是饥饿的),所以这是一个很大的努力。

由于CertIdP和CertSP都是由IdP和SP明确信任的同一机构(CA)颁发的,因此我们认为我们可以使用CA的证书进行签名验证。如果这样做,这可能消除了在IdP和SP之间交换证书的需要。 CA的证书也非常“长寿”,所以如果只需要在永恒中交换一次(永恒,在我们的情况下大约是10 - 20年)。

但是我不确定在技术上是否可以验证使用CertIdP签名的签名只有父级CertCA。可能吗?或者我们在这里完全错误的轨道?

如果相关,我们在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>

3 个答案:

答案 0 :(得分:5)

取决于您的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>

VS

<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并将其添加到本地密钥库。保持本地密钥库的性能,可用性和隐私相关。

答案 1 :(得分:3)

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

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

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

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

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

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

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

答案 2 :(得分:2)

简短的回答是“不”。如果您只拥有CA的证书但没有IdP或SP的证书,则无法验证IdP或SP的签名。

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

假设SP有一个公钥,使上面的验证工作,现在它想验证这个公钥实际上属于IdP。为此,它需要一个包含公钥和IdP名称的证书,以及来自可信实体(在本例中为CA)的签名。由于您没有此功能,因此无法验证IdP是否执行了签名。