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

Java基于Apache POI实现XLSX文件XAdES-T数字签名接入时间戳服务器问题咨询

问题核心原因

Apache POI的数字签名模块默认生成XAdES-EPES格式,你没有显式指定XAdES等级,且存在无效的Mock时间戳逻辑导致合法时间戳无法写入签名结构,因此无法得到XAdES-T格式结果。

必做修改项

  • 显式指定XAdES格式等级为T
    在签名配置的XAdES相关参数区域添加如下代码,强制输出XAdES-T格式:
signatureConfig.setXadesForm(SignatureConfig.XAdESForm.XAdES_T);
  • 替换/删除无效Mock时间戳逻辑
    你当前的Mock TSP实现返回的是不符合RFC3161规范的随机字符串,POI无法解析为合法时间戳令牌,会直接跳过时间戳写入流程。如果是公网环境测试直接删除Mock逻辑即可,本地无公网环境需要部署符合规范的本地TSP服务提供合法时间戳令牌。
  • 检查依赖完整性
    确保项目引入了和POI版本匹配的时间戳处理依赖:
    • org.apache.santuario:xmlsec 用于XML签名结构处理
    • org.bouncycastle:bcpkix-jdk18on、org.bouncycastle:bcprov-jdk18on 用于TSP令牌解析和加密运算
  • 可选优化:移除多余的高级XAdES配置
    你当前代码引入了XAdESXLSignatureFacet并配置了CRL、OCSP吊销信息,这是XAdES-XL等级的要求,如果你只需要XAdES-T格式可以直接删除该Facet和对应的吊销数据配置,降低配置复杂度。

修改后核心配置示例

// 省略其余原有配置
signatureConfig.addSignatureFacet(new OOXMLSignatureFacet());
signatureConfig.addSignatureFacet(new EnvelopedSignatureFacet());
signatureConfig.addSignatureFacet(new KeyInfoSignatureFacet());
XAdESSignatureFacet xadesFacet = new XAdESSignatureFacet();
signatureConfig.addSignatureFacet(xadesFacet);
// 显式指定XAdES-T格式
signatureConfig.setXadesForm(SignatureConfig.XAdESForm.XAdES_T);
// 配置公网可用的时间戳服务器
signatureConfig.setTspUrl("http://timestamp.comodoca.com/rfc3161");
signatureConfig.setTspRequestPolicy(null);
// 省略其余原有配置

内容的提问来源于stack exchange,提问作者leminhduc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:06:04