我试图在一台计算机上签名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命令时使用另一个密钥容器。这是正确的吗?是什么原因造成的,我能解决吗?
发布于 2013-12-13 10:38:15
上面提到的MSDN示例遗漏的是创建的签名中的KeyInfo
结构。KeyInfo
甚至允许您将证书包含在已签名的文档中,这使得证书完全可移植--证书是签名文档的一部分,这意味着在接收方您不仅可以验证签名,还可以接受或拒绝证书(通常涉及拇指指纹查找)。
我在MSDN文章中也不喜欢的是缺乏理论--有三种类型的签名--信封、信封和分离。这种区别可能很重要,最好能更深入地了解正在发生的事情。
这就是为什么我编写了一个包含三个部分的教程,介绍可互操作的XMLDsig。我展示了如何以可互操作的方式在C#和Java中创建和验证签名:
第一部分(理论) http://www.wiktorzychla.com/2012/12/interoperable-xml-digital-signatures-c.html
第2部分(C#) 20.html
第3部分(Java) 4247.html
https://stackoverflow.com/questions/20572737
复制