我正在创建一个对用户身份进行身份验证的应用程序,并构建一个签名的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,但它似乎无法让您从商店中完整地检索现有证书(即使用私钥)。
非常感谢。
蒂姆。