是否可以验证仅在层次结构中具有祖先或根证书的签名?
免责声明:我是证书处理的新手,所以请原谅幼稚的术语。
考虑以下情况。
我的问题是: SP 是否可以仅通过其父证书 CertCA 验证由 CertIdP 签署的消息的签名?
背景故事,为什么要它。
我们正在使用 PicketLink 实现基于 SAML 的 SSO。我们正在使用 PicketLink 的 SAML2SignatureValidationHandler验证签名。为了实现这一点,服务提供商 (SP) 需要在其 keystore 中拥有 IdP 的证书。当签名的 SAML 断言传递给 SP 时,此处理程序使用 IdP 的证书来验证签名。
上述过程运行良好,但我们有一些组织方面的问题。此过程假定 SP 具有 IdP 的验证证书。万一发生变化,必须在 SP 端更换 IdP 的证书。我们可能有大量的 SP(数百而不是数千),所以这是一项相当大的努力。
由于 CertIdP 和 CertSP 均由 IdP 和 SP 绝对信任的同一机构 (CA) 颁发,因此我们想到可以使用 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>
最佳答案
这取决于您的 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 的本地 keystore 中找不到签名证书,它将联系 Web 服务以检索新的 CertIdP 并将其添加到本地 keystore 。保持本地 keystore 与性能、可用性和隐私相关。
关于certificate - 在没有中间证书的情况下验证签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24905170/