在C#中签名并验证XML文件

时间:2013-12-13 17:42:28

标签: c# .net xml xml-signature

我正在尝试在一台计算机上签署XML,然后在另一台计算机上验证XML。我已经看到了这个问题(Signed and Verify xml file in C#),但提问者不清楚,找不到答案。

我使用此处的示例签署并验证XML文件: http://msdn.microsoft.com/en-us/library/ms229745(v=vs.110).aspx

如果我在同一台计算机上同时运行签名和验证,则验证有效。但是当我尝试在另一台计算机上进行验证时,它会失败

在签署文件之前,我创建了这样的密钥容器:

aspnet_iisreg -pc "MY_KEY_CONTAINER" -exp

我签署XML然后导出密钥(请注意,我不使用-pri导出私钥):

aspnet_iisreg -ps "MY_KEY_CONTAINER" "D:\\MY_KEY_CONTAINER.xml" 

然后在另一台计算机上导入密钥:

aspnet_iisreg -pi "MY_KEY_CONTAINER" "D:\\MY_KEY_CONTAINER.xml"

然后,在第二台计算机上,我运行在第一台计算机上运行的相同的验证应用程序。但是,在第二台计算机上验证失败。两台机器上的设置是相同的。两者都运行相同的.net版本。

我想确认我描述的应该的过程。如果我的代码没有问题,我上面描述的密钥交换过程是否有效?

编辑:我开始将密钥打印到屏幕上,并意识到即使我删除旧密钥并创建新密钥,应用程序中的密钥也不会改变。似乎有两个不同的密钥容器,即使它们具有相同的名称。我的应用程序正在访问一个密钥容器,而在运行aspnet_iisreg命令时正在使用另一个密钥容器。它是否正确?造成这种情况的原因是什么?我能解决吗?

1 个答案:

答案 0 :(得分:0)

提到的MSDN示例未命中的是创建的签名中的KeyInfo结构。 KeyInfo允许您甚至将证书包含在签名文档中,使其完全可移植 - 证书是签名文档的一部分,这意味着在接收方,您不仅可以验证签名,还可以接受或拒绝证书(通常这涉及指纹查找)。

我在MSDN文章中也不喜欢的是缺乏理论 - 有三种类型的签名 - 包络,包络和分离。区别可能很重要,最好更深入地了解正在发生的事情。

这就是为什么我写了一个涵盖可互操作的XMLDsig的三部分教程。我将展示如何以可互操作的方式在C#和Java中创建和验证签名:

第1部分(理论)http://www.wiktorzychla.com/2012/12/interoperable-xml-digital-signatures-c.html

第2部分(C#)http://www.wiktorzychla.com/2012/12/interoperable-xml-digital-signatures-c_20.html

第3部分(Java)http://www.wiktorzychla.com/2012/12/interoperable-xml-digital-signatures-c_4247.html