Xml 签名在 .NET 中验证正常但在 Java 中失败
Xml signatures verifies OK in .NET but fails in Java
我在 SO 中 post 这是因为我无法在任何地方找到解决方案并且花了很多时间来找出问题所在。我希望将来遇到同样问题的开发人员能找到这个 post :)
C14N 转换在 .NET 和 Java 中的实现似乎有所不同。两个不同的 "standards".
如果 Java 客户端 可能 需要验证包含的 xml 签名。 Java 似乎在验证包含的签名(!)
之前剥离了 xmlns:xml 声明
如果签名使用 C14N 转换(黄色框),则删除(不要手动添加!)任何 xmlns:xml 声明(红色框)。未经测试,但这也可能适用于执行 C14N 转换。
- Java(C14N 转换)在验证签名
之前删除任何 xmlns:xml 命名空间声明
- .NET(C14N 转换)在验证签名
之前保持 xmlns:xml 命名空间声明不变
因此,xml-哈希值将不同,Java 将报告签名失败,而 .NET 将报告它正常(当然,如果正常)。
此问题仅针对 Java 和 .NET 进行了验证,但也可能适用于其他签名 - API。
这归咎于 XML 规范化规范。第 4.6 节(Superflous 命名空间声明)首先声明:
Unnecessary namespace declarations are not made in the canonical form.
这意味着删除了XML命名空间的声明,然后说
The root document element is handled specially since it has no parent
element. All namespace declarations in it are retained, except the
declaration of an empty default namespace is automatically omitted.
这意味着XML命名空间的声明被保留。
编写规范很难!
我在 SO 中 post 这是因为我无法在任何地方找到解决方案并且花了很多时间来找出问题所在。我希望将来遇到同样问题的开发人员能找到这个 post :)
C14N 转换在 .NET 和 Java 中的实现似乎有所不同。两个不同的 "standards".
如果 Java 客户端 可能 需要验证包含的 xml 签名。 Java 似乎在验证包含的签名(!)
之前剥离了 xmlns:xml 声明如果签名使用 C14N 转换(黄色框),则删除(不要手动添加!)任何 xmlns:xml 声明(红色框)。未经测试,但这也可能适用于执行 C14N 转换。
- Java(C14N 转换)在验证签名 之前删除任何 xmlns:xml 命名空间声明
- .NET(C14N 转换)在验证签名 之前保持 xmlns:xml 命名空间声明不变
因此,xml-哈希值将不同,Java 将报告签名失败,而 .NET 将报告它正常(当然,如果正常)。
此问题仅针对 Java 和 .NET 进行了验证,但也可能适用于其他签名 - API。
这归咎于 XML 规范化规范。第 4.6 节(Superflous 命名空间声明)首先声明:
Unnecessary namespace declarations are not made in the canonical form.
这意味着删除了XML命名空间的声明,然后说
The root document element is handled specially since it has no parent element. All namespace declarations in it are retained, except the declaration of an empty default namespace is automatically omitted.
这意味着XML命名空间的声明被保留。
编写规范很难!