从合格属性 Xades4j 中删除签名证书

问题描述 投票:0回答:1

我正在使用 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>
xml-signature xades4j
1个回答
0
投票

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
中配置)时才允许这样做。这已经是对于我来说有点太灵活了,但默认值仍然可以是当前的行为..

看了我上面的解释,你还有更多的想法吗?请在评论中分享。

© www.soinside.com 2019 - 2024. All rights reserved.