lex*_*ore 8 certificate digital-certificate saml saml-2.0 picketlink
是否可以验证仅在层次结构中具有祖先或根证书的签名?
免责声明:我是证书处理的新手,所以请原谅天真的术语.
考虑以下情况.
我的问题是: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)
这取决于您的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并将其添加到本地密钥库.保持本地密钥库的性能,可用性和隐私相关.