【问题标题】:Sign and Verify XML file in C#在 C# 中签名和验证 XML 文件
【发布时间】:2013-12-13 17:42:27
【问题描述】:

我正在尝试在一台计算机上签署 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 命令时正在使用另一个密钥容器。它是否正确?这是什么原因造成的,我可以解决吗?

【问题讨论】:

    标签: c# .net xml xml-signature


    【解决方案1】:

    上面提到的 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

    【讨论】:

    • 谢谢,这有助于解决一些问题。但是,我的问题实际上是关于如何共享公钥,以便可以在另一台计算机上验证 XML 文件。 MSDN 示例使用您描述的“进化”实现。但是文章没有描述如何分发公钥。我希望能够将公钥放在闪存驱动器上并将其复制到另一台计算机上,然后验证该计算机上的 XML。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 2019-11-21
    相关资源
    最近更新 更多