是否可以验证仅在层次结构中具有祖先或根证书的签名?
免责声明:我是证书处理的新手,所以请原谅幼稚的术语。
考虑以下情况。
- 我们有两方(让我们称它们为身份提供者的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 收到 IdP 使用 CertIdP 签名的消息。如上所述,SP 没有 CertIdP,只有父证书 CertCA。
我的问题是:SP 可以验证 CertIdP 仅具有其父证书 CertCA 签名的消息的签名吗?
背景故事,为什么要它。
我们正在使用 PicketLink 实施基于 SAML 的 SSO。我们使用 PicketLink 的SAML2SignatureValidationHandler来验证签名。为此,服务提供商 (SP) 需要在其密钥库中拥有 IdP 的证书。当签名的 SAML 断言传递给 SP 时,此处理程序使用 IdP 的证书来验证签名。
上述过程运行良好,但我们有一些组织问题。此过程假定 SP 具有 IdP 的验证证书。万一发生变化,必须在 SP 端更换 IdP 的证书。我们可能有大量的 SP(如果不是数千,则为数百),因此这是一项相当大的努力。
由于 CertIdP 和 CertSP 都是由同一个颁发机构 (CA) 颁发的,而 IdP 和 SP 都绝对信任该颁发机构,因此我们想到可以使用 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>