我正在对 XML 文档进行数字签名并在 2 台不同的机器上验证它(在一台机器上签名并在另一台机器上验证)。
我正在执行以下操作来验证 CSharp.Net 中的 XML DSIG。
public static Boolean VerifyXml(XmlDocument document)
{
document.PreserveWhitespace = true;
// Create a new CspParameters object to specify
// a key container.
CspParameters cspParams = new CspParameters();
cspParams.KeyContainerName = "XML_DSIG_RSA_KEY";
// Create a new RSA signing key and save it in the container.
//**Earlier was getting exception here in rsaKey object**
RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams);
// Create a new SignedXml object and pass it
// the XML document class.
SignedXml signedXml = new SignedXml(document);
// Find the "Signature" node and create a new
// XmlNodeList object.
// It's guaranteed that there's always exists a signature
XmlNodeList nodeList = document.GetElementsByTagName("Signature");
// Load the <signature> node.
signedXml.LoadXml((XmlElement)nodeList[0]);
// Check the signature and return the result.
bool isDone = signedXml.CheckSignature(rsaKey); //**This is returning false.**
return isDone;
}
最初,当我的 Web 应用程序尝试访问密钥容器时,我得到了 PermissionDenied 异常。但是,我暂时将应用程序用户和 IIS 用户添加到管理员角色,并使用 CasPol 为我的 Web 应用程序分配了 FullTrust 安全策略。
Q1:[我的第一个问题是克服这个问题的最佳方法是什么??我知道分配 web 应用程序完全信任并将用户添加到管理员角色不是一个好主意,即使它有效
我的第二个问题是关于signedXml.CheckSignature(rsaKey);
返回的错误。现在根据我的理解,由于 XML 文档是在另一台机器上进行数字签名的,因此用于签名的 MAC 存储在该机器上 KEY Container Name "XML_DSIG_RSA_KEY",但是当我尝试验证主机上的签名时,不同的 MAC 是生成并存储在主机上的容器名称“XML_DSIG_RSA_KEY”中,因此数字签名没有得到验证。
Q2:这个假设正确吗?以及解决此问题的最佳方法是什么...在这种情况下,我是否应该使用证书对 XML 文档进行数字签名,然后对其进行验证。我是否需要将证书与 DSIG XML 文档一起提供????