如何用DSS 6.0生成仅含OCSP不含CRL的LTV PDF签名?
DSS 6.0 OCSP嵌入与LTV签名问题解答
问题背景
我正在使用DSS 6.0,依赖配置如下:
<dependency> <groupId>eu.europa.ec.joinup.sd-dss</groupId> <artifactId>dss-pades</artifactId> <version>6.0</version> </dependency>
此前成功生成带LTV的PDF签名,但1KB的PDF变为7MB,经排查是因嵌入了CRL。现决定仅使用OCSP而非CRL,为此做了两处修改:设置certificateVerifier.setCrlSource(null);,并添加certificateVerifier.setAlertOnMissingRevocationData(new LogOnStatusAlert(Level.WARN));避免异常。但签名后的文档有效却不具备LTV属性。
我通过重写OnlineOCSPSource的方法验证,DSS 6.0已调用OCSP接口并获取到响应,且尝试了PAdES_BASELINE_LT和PAdES_BASELINE_LTA两种模式,问题仍存在。
现咨询:
- 如何让DSS 6.0显式嵌入OCSP响应?
- 生成LTV签名是否需要同时存储OCSP和CRL,还是只需其中一种?
问题解答
1. 显式嵌入OCSP响应的操作步骤
仅清空CRL源还不够,需要从签名参数和验证器配置两方面调整,确保OCSP响应被纳入LTV存储:
- 配置签名参数的吊销策略:明确指定仅使用OCSP获取吊销数据,并启用LTV模式
PAdESSignatureParameters signatureParams = new PAdESSignatureParameters(); signatureParams.setSignatureLevel(PAdESSignatureLevel.PAdES_BASELINE_LT); // 强制仅加载OCSP吊销数据 signatureParams.setRevocationDataLoadingStrategy(RevocationDataLoadingStrategy.OCSP_ONLY);
- 确保OCSP源被正确绑定到验证器:不要依赖默认OCSP配置,手动初始化并绑定
OnlineOCSPSource
OnlineOCSPSource customOcspSource = new OnlineOCSPSource(); // 可根据需求配置OCSP请求超时、代理等参数 CommonCertificateVerifier certVerifier = new CommonCertificateVerifier(); certVerifier.setOcspSource(customOcspSource); certVerifier.setCrlSource(null); certVerifier.setAlertOnMissingRevocationData(new LogOnStatusAlert(Level.WARN));
- 确认签名流程完整:确保签名时使用的
PAdESService正确关联了上述验证器和参数,没有跳过LTV数据嵌入的步骤。
2. LTV签名对吊销数据的要求
不需要同时存储OCSP和CRL,只要有能有效验证签名证书吊销状态的其中一种数据即可。LTV的核心是把签名验证所需的离线验证数据嵌入PDF,只要OCSP响应有效、覆盖了签名证书的吊销状态,单独嵌入OCSP完全可以生成符合标准的LTV签名。
内容的提问来源于stack exchange,提问作者Shahid Ghafoor
相关产品推荐
相关产品推荐

