【问题标题】:Xml signatures verifies OK in .NET but fails in JavaXml 签名在 .NET 中验证正常,但在 Java 中失败
【发布时间】:2020-07-28 16:05:20
【问题描述】:

我在 SO 中发布了这个,因为我无法在任何地方找到解决方案,并且花了很多时间来找出问题所在。我希望一些遇到同样问题的开发人员将来能找到这篇文章:)

C14N 转换在 .NET 和 Java 中的实现方式似乎不同。两种不同的“标准”。

如果 Java 客户端可能需要验证包含的 xml 签名,切勿手动将 xmlns:xml 命名空间添加到您的 xml 文档中。 Java 似乎在验证包含的签名之前剥离了 xmlns:xml 声明(!)

【问题讨论】:

  • 您使用什么库来处理签名?也许 digidoc4j 会更好用?它完全符合 eIDAS 和欧盟
  • 嗨@MargusPala。我正在使用 .NET 框架(4.7.2)。我的签名在由 Java 客户端验证时失败,但在使用 .NET Framework 的客户端中正常。我在 .NET 中使用 SignedXml API,在 .NET Framework 中使用“标准”C14N 转换。我的错误是我手动将 xmlns:xml 命名空间添加到正在签名的 xml 中。 Java 在其 C14N 转换实现中删除了那个。

标签: java .net xml digital-signature


【解决方案1】:

将此归咎于 XML 规范化规范。第 4.6 节(多余的命名空间声明)首先声明:

不必要的命名空间声明不是以规范形式进行的。

这意味着XML命名空间的声明被删除,然后说

根文档元素被特殊处理,因为它没有父元素 元素。保留其中的所有命名空间声明,除了 空的默认命名空间的声明会被自动省略。

这意味着保留了 XML 命名空间的声明。

编写规范很难!

【讨论】:

  • 感谢您指出这一点,迈克尔。有趣的。我没有时间阅读整个规范。我可能应该:)
【解决方案2】:

如果签名使用 C14N 转换(黄色框),则删除(不要手动添加!)任何 xmlns:xml 声明(红色框)。未经测试,但这可能也适用于执行 C14N 转换。

  • Java(C14N 转换)在验证签名之前删除任何 xmlns:xml 命名空间声明
  • .NET(C14N 转换)在验证签名之前保持 xmlns:xml 命名空间声明原样

因此,xml-hashvalues 会有所不同,Java 会报告签名失败,而 .NET 会报告签名失败(当然,如果可以的话)。

此问题仅针对 Java 和 .NET 进行了验证,但也可能适用于其他签名 API。

【讨论】:

    猜你喜欢
    • 2021-04-05
    • 2012-10-20
    • 1970-01-01
    • 2023-03-06
    • 2021-09-07
    • 2021-09-17
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多