Нигде не нашел похожего примера. Я работаю с lateExternalSigning. У меня он работает с прямой подписью externalSigning.getContent (), но часть этого содержимого становится слишком большой для передачи во внешнюю службу подписи.
Это фрагмент кода, который сейчас работает для меня, он после записанное содержимое pdf возвращается из внешней службы подписи.
try {
PDDocument pdf = PDDocument.load(preSignaturePdf); //pdf with "empty signature" added from before
CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
X509Certificate[] cert = CertificateHelper.createCertificate(certPEM);
gen.addCertificates(new JcaCertStore(Arrays.asList(cert)));
ContentSigner nonSigner = new ContentSigner() {
@Override
public byte[] getSignature() {
return signature; //from external signing service
}
@Override
public OutputStream getOutputStream() {
return new ByteArrayOutputStream();
}
@Override
public AlgorithmIdentifier getAlgorithmIdentifier() {
return new DefaultSignatureAlgorithmIdentifierFinder().find("SHA256WithRSA");
}
};
JcaSignerInfoGeneratorBuilder sig = new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().build());
sig.setDirectSignature(true);
PemReader pemReader = new PemReader(new StringReader(certPEM));
gen.addSignerInfoGenerator(sig.build(nonSigner, new X509CertificateHolder(pemReader.readPemObject().getContent())));
CMSSignedData signedData = gen.generate(new CMSAbsentContent(), true);
PDSignature lastSignature = pdf.getLastSignatureDictionary();
pdf.close();
int offset = lastSignature.getByteRange()[1] + 1;
try (RandomAccessBuffer raf = new RandomAccessBuffer(preSignaturePdf)) {
raf.seek(offset);
raf.write(Hex.getBytes(signedData.getEncoded()));
}
Как я могу сделать то же самое, но с подписанным pdf ha sh?