如何从C#.NET Core应用程序中的中央证书存储中检索完整的X509证书

时间:2019-01-24 15:00:53

标签: .net-core x509certificate saml-2.0

我正在创建一个对用户身份进行身份验证的应用程序,并构建一个签名的SAML令牌,并将其提供给第三方客户端应用程序,该第三方客户端应用程序是由我的应用程序提供的服务的使用者。

一个用户被传递到我的应用程序中,在那里他将通过用户名/密码来标识自己。然后,我的代码必须提供用户详细信息作为SAML令牌的有效负载,然后将其传递给第三方应用程序。

我终于找到了创建SAML XML文档的解决方案,但是在对它进行编码以创建SAML令牌之前,我需要使用X509证书对其进行签名。

签名的代码是这样的:

    public XmlDocument SignDocument(XmlDocument xmlDocument, X509Certificate2 certificate)
    {
        var sig = new SignedXml(xmlDocument);
        // Add the key to the SignedXml xmlDocument. 
        sig.SigningKey = certificate.PrivateKey;

        // Create a reference to be signed. 
        var reference = new Reference();
        reference.Uri = String.Empty;

        // Add an enveloped transformation to the reference. 
        var env = new XmlDsigEnvelopedSignatureTransform();
        reference.AddTransform(env);

        // Add the reference to the SignedXml object. 
        sig.AddReference(reference);

        // Add an RSAKeyValue KeyInfo (optional; helps recipient find key to validate). 
        var keyInfo = new KeyInfo();
        var keyData = new KeyInfoX509Data(certificate);

        keyInfo.AddClause(keyData);
        sig.KeyInfo = keyInfo;

        // Compute the signature. 
        sig.ComputeSignature();
        var status = sig.CheckSignature(certificate, true);

        // Get the XML representation of the signature and save it to an XmlElement object. 
        var xmlDigitalSignature = sig.GetXml();
        xmlDocument.DocumentElement.InsertBefore(xmlDigitalSignature,
        xmlDocument.DocumentElement.ChildNodes[1]);
        return xmlDocument;
    }

我想为我的X509证书使用一个集中存储,然后将公用密钥提供给第三方客户端应用程序。我想使用一个X509证书来签名每个SAML。

我的.NET Core应用程序将在AWS虚拟机上的Docker Linux容器上运行。

所以我需要回答的关键问题:

1)用来存储和检索X509证书的最佳商店是什么?

我需要检索整个证书(而不仅仅是公共部分),因为需要私有密钥来签署SAML。

2)如何从代码访问商店并将其检索到X509Certificate2对象中以传递给上面的代码。

问题1)中的商店是否有可用的SDK。

我当时在看AWS ACM,但它似乎无法让您从商店中完整地检索现有证书(即使用私钥)。

非常感谢。

蒂姆。

0 个答案:

没有答案