LTV включен pdf iText 7 - PullRequest
       31

LTV включен pdf iText 7

0 голосов
/ 13 февраля 2019

Я прочитал много вопросов / ответов о том, как включить PDF PDF с использованием iTextНи один из них не работал для меня.У меня есть пара PDF, и я устанавливаю поле подписи, которое затем использую для вызова метода signDetached и подписания PDF.Я использую:

signer.signDetached(new BouncyCastleDigest(), pks, chain,
 Collections.singleton(crlClient), ocspClient, tsc,0, subfilter);

Но ничего не произошло.Я прочитал, что вы должны включить все сертификаты, кроме root.Я добавляю цепочку моего частного сертификата (который я использую для подписи в формате pdf), но я не нашел возможного способа включить сертификат TSA.

Я использую версию iText 7.X .

KeyStore ks = getKeyStore();
        Certificate[] chain = null;
        Enumeration<String> al = ks.aliases();
        for (Enumeration<String> l = al; l.hasMoreElements();) {
            String alias = (String) l.nextElement();
            chain = ks.getCertificateChain(alias);
        }
        PrivateKey pk = (PrivateKey) ks.getKey(ks.aliases().nextElement(), "******".toCharArray());
        IExternalSignature pks = new PrivateKeySignature(pk, digestAlgorithm, BouncyCastleProvider.PROVIDER_NAME);
        OCSPVerifier ocspVerifier = new OCSPVerifier(null, null);
        OcspClientBouncyCastle ocspClient = new OcspClientBouncyCastle(ocspVerifier);
        String url = CertificateUtil.getCRLURL((X509Certificate) chain[0]);
        CrlClientOnline crlClient = new CrlClientOnline(url);
        try {
            signer.signDetached(new BouncyCastleDigest(), pks, chain, Collections.singleton(crlClient), ocspClient, tsc,
                    0, subfilter);

        } catch (Exception ex) {
            System.out.println("Tzizzzzzzzzzzzzzzz" + ex.getCause());
        }

private KeyStore getKeyStore()
            throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException {
        KeyStore ks = KeyStore.getInstance("pkcs12");
        ks.load(new FileInputStream("tsaPath"), "****".toCharArray());
        ks.load(new FileInputStream("p12Path"), "*******".toCharArray());
        return ks;
    }

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Через несколько часов я придумал решение.Просто чтобы быть уверенным, что у Adobe есть свое собственное хранилище доверенных сертификатов, поэтому вы должны либо использовать один из их сертификатов, либо использовать хранилище доверенных сертификатов Windows, соответственно настроить AC Reader и добавить в него корневой сертификат.Как уже упоминалось, вы должны включить всю цепочку сертификации в ваш PDF документ.Вы можете посетить мой проект GitHub , чтобы увидеть рабочий пример, который подписывает документ PDF, зашифровывает его закрытым ключом и делает его доступным для ltv, используя iText 7, используя timepstap из ERMIS.

Создание образца с поддержкой ltv:

private void ltvEnable(PdfSigner signer, ByteArrayOutputStream baos, OutputStream os, String name,
            OcspClientBouncyCastle ocspClient, CrlClientOnline crlClient, CustomTSAClient tsc) {
        ByteArrayInputStream signedPdfInput = new ByteArrayInputStream(baos.toByteArray());
        try {
            PdfReader pdfReader = new PdfReader(signedPdfInput);
            PdfDocument document = new PdfDocument(pdfReader.setUnethicalReading(true), new PdfWriter(os),
                    new StampingProperties().useAppendMode());
            LtvVerification ltvVerification = new LtvVerification(document);
            ltvVerification.addVerification(name, ocspClient, crlClient, LtvVerification.CertificateOption.WHOLE_CHAIN,
                    LtvVerification.Level.OCSP_CRL, LtvVerification.CertificateInclusion.YES);
            ltvVerification.merge();
            document.getCatalog().getPdfObject().getAsDictionary(PdfName.DSS).getAsArray(PdfName.Certs)
                    .add(new PdfStream(
                            IOUtils.toByteArray(getClass().getClassLoader().getResourceAsStream("HPARCA_CA.cer"))));
            document.close();
            pdfReader.close();

        } catch (IOException | GeneralSecurityException e) {
            LOG.error("Error while making signature ltv enabled");
        }
    }

Параметры хитрой детали:

OCSPVerifier ocspVerifier = new OCSPVerifier(null, null);
OcspClientBouncyCastle ocspClient = new OcspClientBouncyCastle(ocspVerifier);
CrlClientOnline crlClient = new CrlClientOnline();
0 голосов
/ 14 февраля 2019

LTV не может включить вашу примерную подпись в целом.

Прежде всего, ваш сертификат подписавшего не от CA, которому по умолчанию доверяет Adobe Reader, то есть CAСертификат не указан ни в AATL, ни в EUTL.Программа чтения PDF никогда не будет называть подпись «с поддержкой LTV», если она каким-либо образом не доверяет подписавшему.

Кроме того, сертификат подписавшего не имеет какого-либо расширения AIA (Authority Information Access), из которого код подписи мог бы определять местоположения дляполучить сертификат эмитента или информацию об аннулировании.Отсутствующая информация делает невозможным автоматический поиск сертификатов и информации об аннулировании без дальнейших церемоний.

Даже если ЦС был доверенным, автоматическое включение LTV все равно потребовало бы специального кода.


В ходе комментариев здесь (и в связи с поддержкой iText) выяснилось, что представленный пример подписи не является репрезентативным;с другой стороны, были другие соответствующие граничные условия, и вы в конечном итоге приступили к созданию подпрограммы с поддержкой LTV в вашем случае использования.

Подробности об этой подпрограмме можно найти в вашем ответе.

...