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

