Certificate 验证没有中间证书的签名

Certificate 验证没有中间证书的签名,certificate,saml,saml-2.0,digital-certificate,picketlink,Certificate,Saml,Saml 2.0,Digital Certificate,Picketlink,是否可以验证层次结构中只有祖先或根证书的签名? 免责声明:我是证书处理的新手,所以请原谅这个幼稚的术语 考虑以下情况 我们有两个方面(对于身份提供商,我们称他们为IdP,对于服务提供商,我们称他们为SP)和一些中央证书颁发机构CA,它们是IdP和SP绝对信任的 CA拥有IdP和SP都知道的自己的证书CertCA(以某种别名导入IdP和SP的密钥库) Out CA为IdP(CertDP)和SP(CertSP)颁发一份证书 IdP的密钥库中有CertIdP,并且知道它的密码,因此IdP可以使用Ce

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

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

考虑以下情况

  • 我们有两个方面(对于身份提供商,我们称他们为IdP,对于服务提供商,我们称他们为SP)和一些中央证书颁发机构CA,它们是IdP和SP绝对信任的
  • CA拥有IdP和SP都知道的自己的证书CertCA(以某种别名导入IdP和SP的密钥库)
  • Out CA为IdP(CertDP)和SP(CertSP)颁发一份证书
  • IdP的密钥库中有CertIdP,并且知道它的密码,因此IdP可以使用CertIdP对消息进行签名
  • SP/CertSP也一样

  • 现在让我们假设SP不知道CertDP,IdP不知道CertSP。他们只知道CertCA,用于签署CertDP和CertSP。(据我所知,我们有一个证书层次结构CertIdP-->CertCA,这取决于SAML响应是否包含签名证书
    ..
    ,或者仅包含其公钥
    ..

    <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>
    
    
    ...
    
    我将从一些小的介绍开始-数字签名的验证分两个阶段完成

    • 第一个签名验证-检查签名值是否实际对应于它所保护的内容,以及内容是否因此被篡改
    • 信任验证-检查签名是否由验证人信任的人进行)
    数字签名的验证要求公钥的位置,其相应的私钥用于创建签名。这是没办法的

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

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

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

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

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

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


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

    目前,我只获得SignedInfo和SignedValue(请参阅问题中的更新)。但您的意思是,如果我有X509Data和证书,那么我可以使用CA证书验证它,对吗?我刚刚了解到,
    元素在xmldsig模式以及SAML 2.0核心标准中是可选的。是的,您只需要获得签名证书,无论是通过
    还是通过其他方式,都取决于用例。使用集中式设置机制的方法也可以在不使用公钥信息的情况下工作,例如,通过提供当前验证证书的著名URL。@lexicore您将始终需要用于签名的证书来验证它。无法仅使用CA证书进行验证,因为您不知道签名是否使用了此CA或任何其他CA颁发的证书。如果可以,请将您的IdP设置为将签名IdP证书放入
    元素的SAML中。谢谢!因为这是第一个正确的答案,所以授予赏金。
    <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>