Apache Santuario和Java XML数字签名API之间的不同XML签名



我做了两个应该做同样事情的实现:用给定的X509证书对XML文件进行签名。

  • 我用原生Java XML数字签名API(来自javax.XML.crypto.dsi(做的第一个
  • 第二个是我在Kotlin中实现的(我的目标是在Android中运行它(,使用Apache Santuario XML Security 2.0.3版本

实际情况是,对于要签名的完全相同的XML文件,它会为SignatureValue生成不同的值。但XML的所有其他属性都完全相同:

  • DigestValue是相同的,这证明文件是相同的
  • KeyInfo/X509Data/X509Certificate是相等的,因此证书肯定是相同的
  • CanonicalizationMethod、SignatureMethod、DigestMethod和Transform算法完全相同

我甚至尝试过小XML(例如,只有<x/>标记(,但SignatureValue始终不匹配。

是否存在来自<签名>标记匹配,SignatureValue除外?

我找到了解决方案。这是因为ApacheSantuario在签名标记中添加了换行符。使得<签名信息>如果比较Apache生成的标记和Java XML签名生成的标记,则标记具有不同的内容。

为了解决这个问题,我在签名之前放了以下代码行。

System.setProperty("org.apache.xml.security.ignoreLineBreaks", "true")

最新更新