You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Java的xades4j库在xades:SigningCertificate中包含完整证书链

如何使用Java的xades4j库在xades:SigningCertificate中包含完整证书链

看起来你已经做了大部分正确的配置,但还差一步就能让完整证书链出现在xades:SigningCertificate里了!我们来梳理问题并调整代码:

问题分析

你已经在KeyingDataProvider中设置了fullChain(true),也在BasicSignatureOptions里指定了includeSigningCertificate(SigningCertificateMode.FULL_CHAIN),这两个都是必要的配置项。但问题可能出在自定义的SignaturePropertiesProvider上——默认的签名证书属性可能因为自定义逻辑没有被自动注入,导致完整链没有被正确添加到签名结构中。

解决方案

我们需要手动在签名属性中添加包含完整证书链的SigningCertificateProperty,确保所有证书节点都被纳入xades:SigningCertificate元素。

修改步骤:

  1. 确认PKCS12文件包含完整链
    首先要确保你的PKCS12文件里确实包含了签名证书、中间证书和根证书。如果文件本身只包含签名证书,后续配置再正确也无法生成多节点的xades:Cert。

  2. 调整签名属性提供者代码
    在你的SignaturePropertiesProvider实现中,手动添加SigningCertificateProperty,并传入从KeyingDataProvider获取的完整证书链。修改后的核心代码如下:

// 先获取完整证书链,注意捕获KeyingDataException异常
X509Certificate[] certChain = keyStoreProvider.getSigningCertificateChain();

// 初始化XadesSigner时调整SignaturePropertiesProvider逻辑
XadesSigner signer = new XadesEpesSigningProfile(keyStoreProvider, policyInfoProvider)
        .withSignaturePropertiesProvider(new SignaturePropertiesProvider() {
            @Override
            public void provideProperties(SignaturePropertiesCollector collector) {
                // 保留原有的签名时间和角色配置
                SigningTimeProperty sigTime = new SigningTimeProperty();
                collector.setSignerRole(
                        new SignerRoleProperty().withClaimedRole("supplier"));
                collector.setSigningTime(sigTime);
                
                // 手动添加包含完整链的SigningCertificateProperty
                SigningCertificateProperty signingCertProp = new SigningCertificateProperty(certChain);
                collector.addSigningCertificate(signingCertProp);
            }
        })
        .withBasicSignatureOptions(
                new BasicSignatureOptions()
                        .signKeyInfo(true)
                        .includeSigningCertificate(SigningCertificateMode.FULL_CHAIN)
                        .includeIssuerSerial(true))
        .newSigner();
  1. 验证结果
    重新执行签名操作后,你应该会看到xades:SigningCertificate下出现多个xades:Cert节点,分别对应签名证书、中间证书和根证书,和你期望的结构一致。

额外排查点

如果修改后还是没有出现完整链,可以检查以下内容:

  • 调用keyStoreProvider.getSigningCertificateChain(),确认返回的数组长度大于1,说明成功加载了完整证书链。
  • 检查xades4j版本,某些旧版本对SigningCertificateMode.FULL_CHAIN的支持存在差异,建议使用较新的稳定版本。

备注:内容来源于stack exchange,提问作者Esteban Arteaga Escobar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 17:23:00