验证没有中间证书的签名

lex*_*ore 8 certificate digital-certificate saml saml-2.0 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>
Run Code Online (Sandbox Code Playgroud)

Chr*_*f R 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>
Run Code Online (Sandbox Code Playgroud)

<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>
Run Code Online (Sandbox Code Playgroud)

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

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