是否可以验证仅在层次结构中具有祖先或根证书的签名?
免责声明:我是证书处理的新手,所以请原谅天真的术语。
考虑以下情况。
我的问题是: 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>
答案 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是否执行了签名。