Как создать подпись pkcs7 с уже подписанным дайджестом файла [lateExternalSigning] - PullRequest
0 голосов
/ 17 июня 2020

Нигде не нашел похожего примера. Я работаю с 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?

...