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

使用DSS库实现PAdES-LT级别PDF签名报错求助及示例需求

PAdES-LT签名报错:签名证书未找到及级别识别异常

我使用DSS库进行PAdES-LT级别的PDF签名,B和T级别签名可正常工作,但LT级别签名起初仅被在线验证器识别为T级别,且当前出现签名证书未找到的报错。我使用外部服务器进行哈希签名,同时配置了TSA,以下是相关代码及错误栈信息,希望获取解决方案及LT级别的可用示例:

List<CertificateResponse> certificateResponses = client.getCertificateChain();
List<Certificate> certificates = new ArrayList<>();
for (CertificateResponse certificateResponse : certificateResponses) {
    byte[] certificate = Base64.getDecoder().decode(certificateResponse.certificate());
    X509Certificate cert = (X509Certificate) CertificateFactory
            .getInstance("X.509").generateCertificate(new ByteArrayInputStream(certificate));
    certificates.add(cert);
}

List<CertificateToken> certificateTokens = certificates.stream()
        .map(c -> new CertificateToken((X509Certificate) c)).toList();

CommonCertificateVerifier certificateVerifier = new CommonCertificateVerifier();

CommonTrustedCertificateSource certificateSource = new CommonTrustedCertificateSource();
for (CertificateToken certificateToken : certificateTokens) {
    certificateSource.addCertificate(certificateToken);
}

OnlineCRLSource onlineCRLSource = new OnlineCRLSource();
onlineCRLSource.setDataLoader(new CommonsDataLoader());
certificateVerifier.setCrlSource(onlineCRLSource);

OnlineOCSPSource onlineOCSPSource = new OnlineOCSPSource();
onlineOCSPSource.setDataLoader(new OCSPDataLoader());
onlineOCSPSource.setNonceSource(new SecureRandomNonceSource());
certificateVerifier.setOcspSource(onlineOCSPSource);

certificateVerifier.setTrustedCertSources(certificateSource);
certificateVerifier.setRevocationDataVerifier(RevocationDataVerifier.createDefaultRevocationDataVerifier());
certificateVerifier.setCheckRevocationForUntrustedChains(true);

PAdESService service = new PAdESService(certificateVerifier);
service.setTspSource(tspSource);

DSSDocument toSignDocument = new InMemoryDocument(pdf);
PAdESSignatureParameters parameters = new PAdESSignatureParameters();
parameters.setDigestAlgorithm(DigestAlgorithm.SHA256);
parameters.setSignatureLevel(SignatureLevel.PAdES_BASELINE_LT);
parameters.setGenerateTBSWithoutCertificate(false);
parameters.setSigningCertificate(certificateTokens.get(0));
parameters.setCertificateChain(certificateTokens);
parameters.setCheckCertificateRevocation(true);

ToBeSigned dataToSign = service.getDataToSign(toSignDocument, parameters);

final SigningRequest signingRequest = new SigningRequest();
signingRequest.setHashSignatures(List.of(new HashSignature("id-1", Hasher.hash(dataToSign.getBytes()).bytes())));
final SigningResult signingResult = client.sign(signingRequest);

SignatureValue signatureValue = new SignatureValue(SignatureAlgorithm.RSA_SHA256,
        Base64.getDecoder().decode(signingResult.signature()));

DSSDocument signedDocument = service.signDocument(toSignDocument, parameters, signatureValue);

报错信息:

2023-08-24T17:43:04.200+02:00  WARN 38245 --- [           main] e.e.e.d.s.x.SignatureIntegrityValidator  : Determining signing certificate from certificate candidates list failed: [Best candidate validation failed : Unable to validate CMS Signature : can't create content verifier: exception on setup: java.security.InvalidKeyException: Supplied key (null) is not a RSAPublicKey instance]
eu.europa.esig.dss.exception.IllegalInputException: Signing certificate token was not found! Unable to verify its validity range. Use method setSignWithNotYetValidCertificate(true) to skip the check.
    at eu.europa.esig.dss.signature.SignatureRequirementsChecker.assertSigningCertificateIsYetValid(SignatureRequirementsChecker.java:104)
    at eu.europa.esig.dss.signature.SignatureRequirementsChecker.assertSigningCertificateIsValid(SignatureRequirementsChecker.java:88)
    at eu.europa.esig.dss.cades.signature.CAdESLevelBaselineT.extendSignerInformation(CAdESLevelBaselineT.java:99)
    at eu.europa.esig.dss.cades.signature.CAdESLevelBaselineT.extendCMSSignatures(CAdESLevelBaselineT.java:84)
    at eu.europa.esig.dss.cades.signature.CAdESSignatureExtension.extendCMSSignatures(CAdESSignatureExtension.java:170)
    at eu.europa.esig.dss.cades.signature.CAdESSignatureExtension.extendCMSSignatures(CAdESSignatureExtension.java:122)
    at eu.europa.esig.dss.cades.signature.CAdESLevelBaselineT.extendCMSSignatures(CAdESLevelBaselineT.java:52)
    at eu.europa.esig.dss.pades.signature.ExternalCMSService.buildCMSSignedData(ExternalCMSService.java:202)
    at eu.europa.esig.dss.pades.signature.PAdESService.generateCMSSignedData(PAdESService.java:246)
    at eu.europa.esig.dss.pades.signature.PAdESService.signDocument(PAdESService.java:209)

看起来证书未被添加到签名中,请问是否有人遇到过类似问题?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 11:22:54