我正在使用 Xades4j 签署 XMl 文档,如何从合格属性中删除此节点
<xades:SigningCertificate>
<xades:Cert>
<xades:CertDigest>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>****************=</ds:DigestValue>
</xades:CertDigest>
<xades:IssuerSerial>
<ds:X509IssuerName>******************</ds:X509IssuerName>
<ds:X509SerialNumber>****************</ds:X509SerialNumber>
</xades:IssuerSerial>
</xades:Cert>
</xades:SigningCertificate>
TL;DR:目前不可能。 xades4j 始终添加
SigningCertificate
属性。
xades4j 实现 ETSI TS 101 903 V1.4.2。在第 4.4.1 XAdES-BES 节中,规范指出:
对于此表单,必须通过以下两种方式之一保护带有签名的签名证书:
- 合并 SigningCertificate 签名属性;或
- 不合并 SigningCertificate,而是将签名证书合并到 ds:KeyInfo 元素并至少签署签名证书。
对于 xades4j 我选择了第一个选项。然而,规范还说:
ds:KeyInfo 元素。 ...如果签名中不存在 SigningCertificate 元素,则以下内容 适用限制:
- ds:KeyInfo 元素必须包含包含签名证书的 ds:X509Data;
- ds:SignedInfo 元素必须包含引用 ds:KeyInfo 的 ds:Reference 元素。 ds:Reference 元素应以至少签名证书实际上是这样的方式构建 已签名。
可以配置 xades4j 来实现最后一个选项,但它不会删除 SigningCertificate 属性。
关于
KeyInfo
内容,目前还不清楚“a ds:X509Data contains the签名证书”是什么意思。在我的解释中,它需要是带有证书本身的 X509Certificate
元素。在您在项目的 Github 问题上提供的示例中(https://github.com/luisgoncalves/xades4j/issues/288),只有一个 X509IssuerSerial
,所以我想说签名不符合规范,因为它不包含保护签名证书的两个选项(如上所述)。
这有点有争议,因为可以说,包含
X509IssuerSerial
也防止了签名者证书的简单替换(规范中提到的目标)。
但是,XAdES 基线配置文件 建议同时存在
SigningCertificate
属性和 X509Certificate
中的 KeyInfo
,因此 xades4j 做得最好。我相信在这种情况下越严格越好。
我可以考虑添加一个配置来不添加
SigningCertificate
,但我想说,只有在密钥信息经过签名并且包含X509IssuerSerial
或X509Certificate
(如BasicSignatureOptions
中配置)时才允许这样做。这已经是对于我来说有点太灵活了,但默认值仍然可以是当前的行为..
看了我上面的解释,你还有更多的想法吗?请在评论中分享。