c# – 验证Digitaly签署XML始终为false
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 验证Digitaly签署XML始终为false,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5043字,纯文字阅读大概需要8分钟。
内容图文
![c# – 验证Digitaly签署XML始终为false](/upload/InfoBanner/zyjiaocheng/788/da8e63a933404a2f93abf5e969233969.jpg)
我使用以下脚本创建一个键值
sn.exe -k KeyFile.snk
sn.exe -m y
sn.exe -i KeyFile.snk test
然后我使用它来验证并使用以下代码snipet签署我的xml
private void SignXml(XmlDocument xmlDoc )
{
CspParameters parms = new CspParameters(1); // PROV_RSA_FULL
parms.Flags = CspProviderFlags.UseMachineKeyStore; // Use Machine store
parms.KeyContainerName = "test"; // "CodeProject" container
parms.KeyNumber = 2; // AT_SIGNATURE
RSACryptoServiceProvider csp = new RSACryptoServiceProvider(parms);
// Creating the XML signing object.
SignedXml sxml = new SignedXml(xmlDoc);
sxml.SigningKey = csp;
// Set the canonicalization method for the document.
sxml.SignedInfo.CanonicalizationMethod =
SignedXml.XmlDsigCanonicalizationUrl; // No comments.
// Create an empty reference (not enveloped) for the XPath
// transformation.
Reference r = new Reference("");
// Create the XPath transform and add it to the reference list.
r.AddTransform(new XmlDsigEnvelopedSignatureTransform(false));
// Add the reference to the SignedXml object.
sxml.AddReference(r);
// Compute the signature.
sxml.ComputeSignature();
// Get the signature XML and add it to the document element.
XmlElement sig = sxml.GetXml();
if (xmlDoc.DocumentElement != null)
xmlDoc.DocumentElement.AppendChild(sig);
}
public static Boolean VerifyXml(XmlDocument doc)
{
// Get the XML content from the embedded XML public key.
Stream s = null;
string xmlkey = string.Empty;
try
{
s = typeof(Program).Assembly.GetManifestResourceStream(
"LicenceVerifier.PubKey.xml");
// Read-in the XML content.
StreamReader reader = new StreamReader(s);
xmlkey = reader.ReadToEnd();
reader.Close();
}
catch (Exception e)
{
Console.Error.WriteLine("Error: could not import public key: {0}",
e.Message);
return false;
}
// Create an RSA crypto service provider from the embedded
// XML document resource (the public key).
RSACryptoServiceProvider csp = new RSACryptoServiceProvider();
csp.FromXmlString(xmlkey);
// Create the signed XML object.
SignedXml sxml = new SignedXml(doc);
try
{
// Get the XML Signature node and load it into the signed XML object.
XmlNode dsig = doc.GetElementsByTagName("Signature",
SignedXml.XmlDsigNamespaceUrl)[0];
sxml.LoadXml((XmlElement)dsig);
}
catch
{
Console.Error.WriteLine("Error: no signature found.");
return false;
}
// Verify the signature.
if (sxml.CheckSignature(csp))
return true;
else
return false;
验证总是返回false的问题,即使我使用密钥的公钥,任何想法如何解决,Signature部分看起来像:
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<DigestValue>XT/TOXNZ6SEe6V3c6Ulxa/rOzLE=</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>t1C/ycVh/8nV1uvc9WKbOTawKQjg3luUi7717AQDHc4N+g7DDHYHAb2zvoSEUTCHIkY9UFenoZqjbLwL9/ejyef/kQe8V/jrj0GZ60BNp8ee0nXSfr91wEdhOo9qqSo/iPbnP8By9tJnbOcJG7EFWjorgMITfHGct4QXfMZFoh4=</SignatureValue>
</Signature>
我喜欢用它们
SignXml(xmlDoc); // where xmlDoc is the xmldocument i create to be signed
///////////////// TO Verify //////////////
try
{
// Create a new CspParameters object to specify
// a key container.
Console.WriteLine("Type path");
var path = Console.ReadLine();
// Create a new XML document.
XmlDocument xmlDoc = new XmlDocument();
// Load an XML file into the XmlDocument object.
xmlDoc.PreserveWhitespace = true;
xmlDoc.Load(path);
// Verify the signature of the signed XML.
Console.WriteLine("Verifying signature...");
bool result = VerifyXml(xmlDoc);
// Display the results of the signature verification to
// the console.
if (result)
{
Console.WriteLine("The XML signature is valid.");
}
else
{
Console.WriteLine("The XML signature is not valid.");
}
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
解决方法:
在我看来,你正在以错误的方式检索一个publik密钥.首先,检查文件LicenceVerifier.PubKey.xml是否将Build Action设置为Embedded Resource.
然后在debug中运行此代码:
typeof(Program).Assembly.GetManifestResourceNames()
并确认将正确的资源名称传递给GetManifestResourceStream.我认为您的代码应如下所示:
var asm = typeof(Program).Assembly;
s = asm.GetManifestResourceStream(asm.GetName().Name + ".LicenceVerifier.PubKey.xml");
或者,如果公钥位于子文件夹中:
var subFolder = "NAME";
var asm = typeof(Program).Assembly;
s = asm.GetManifestResourceStream(asm.GetName().Name + "." + subFolder + ".LicenceVerifier.PubKey.xml");
如果它仍然不起作用,则意味着您的公钥与私钥不匹配.要确认尝试以这种方式修改代码:
private static string SignXml(XmlDocument xmlDoc)
{
...
return csp.ToXmlString(false);
}
public static Boolean VerifyXml(XmlDocument doc, string xmlKey)
{
RSACryptoServiceProvider csp = new RSACryptoServiceProvider();
csp.FromXmlString(xmlKey);
...
}
var xmlKey = SignXml(xml);
var res = VerifyXml(xml, xmlKey);
如果我的怀疑得到确认,那么只需用修改后的SignXml版本返回的xml替换LicenceVerifier.PubKey.xml的内容即可.
内容总结
以上是互联网集市为您收集整理的c# – 验证Digitaly签署XML始终为false全部内容,希望文章能够帮你解决c# – 验证Digitaly签署XML始终为false所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。