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
相关产品推荐
相关产品推荐

