使用两个证书和一个签名

时间:2018-08-29 14:09:53

标签: digital-signature saml saml-2.0 x509certificate2 auth-request

我目前正在为客户开发SSO功能。

如果有必要,我们的应用程序将在启动时使用SSO功能进行身份验证,如果失败,则中止操作。

我已经阅读了很多说明,并在网上看到了很多示例。

我根本不了解的是证书。具体来说,该操作中似乎使用了两个(不同的?)证书。其中一个作为常量存储在我这一边,另一个在SAML响应中的Signature元素中发送,如下所示:

<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="#id-2710abae3b0457ad0c241eac043769ae78c83189">
            <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#" />
            </ds:Transforms>
            <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
            <ds:DigestValue>???</ds:DigestValue>
        </ds:Reference>
        <ds:Reference URI="#id-266b413f5282d3da62de3963e5e25cb0782e1a05">
            <ds:Transforms>
                <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            </ds:Transforms>
            <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
            <ds:DigestValue>???</ds:DigestValue>
        </ds:Reference>
    </ds:SignedInfo>
    <ds:SignatureValue>???</ds:SignatureValue>
    <ds:KeyInfo Id="id-266b413f5282d3da62de3963e5e25cb0782e1a05">
        <ds:X509Data>
            <ds:X509Certificate>???</ds:X509Certificate>
        </ds:X509Data>
    </ds:KeyInfo>
</ds:Signature>

标记为“ ???”的字段客户未在样本回复中给我。

关于其他证书,一个很好的例子是在这里:“ App_Code / AccountSettings.cs”中的https://github.com/onelogin/dotnet-saml

此外,XML中还有一个签名,在其他在线示例中,两个“ DigestValue”字段似乎也包含Base64数据。

所以我的问题是:本地证书与xml证书相同吗?如果不相同,它们之间的关系到底如何,并且签名和DigestValues在这种关系中是否相关?

至于上下文,我正在尝试测试我的SSO功能,除证书外,其他一切似乎都可以正常工作,我无法弄清楚如何在没有真实值的情况下进行测试。可以伪造吗?无论我在XML中输入什么内容,即使是“真实的”示例(在线查找),SignedXml.CheckSignature似乎总是返回false。

1 个答案:

答案 0 :(得分:0)

SAML基于信任圈。

IdP对SP的信任,而SP对IDP的信任。

实现“信任”的方式是,IdP需要注册SPs元数据(entityID,端点和用于验证签名和加密的公共证书),并且SPs同样需要注册IdPs元数据。

根据您的消息,似乎您正在实施SP,因此第一步是在SP上注册IdP元数据,一旦完成,您将在SP上存储IdP实体ID,其端点以及IdP的公共证书。 该证书必须与在SSO过程中IdP发送给SP的SAMLResponse上包含的签名的ds:X509Certificate值相符。