Как я могу подписать PDF-документ цифровой подписью XML?

#java #itext #digital-signature #xml-signature

#java #itext #цифровая подпись #xml-подпись

Вопрос:

Я готовлю MessageDigest (SHA256) PDF-документа и отправляю его на веб-сервис подписи. Эта служба возвращает мне XMLSignature. Чтобы подписать мой PDF-файл, я пытаюсь прикрепить к нему эту XML-подпись. Как я могу это сделать на Java?

Когда я гуглю, я могу найти много ссылок, относящихся к XMLSignature, используемому для подписи содержимого XML, однако я не могу найти, как XMLSignature можно использовать для подписи PDF-документа?

Я знаю, как прикрепить сертификаты к pdf с помощью закрытого ключа, но не могу понять, как должна использоваться подпись XML.

Я могу получить XML-подпись, как показано ниже.

 InputStream certificateIS = new ByteArrayInputStream(decoder.decode({base64_encoded_certificate}));
        CertificateFactory f = CertificateFactory.getInstance("X.509");
        X509Certificate certificate = (X509Certificate)f.generateCertificate(certificateIS);
        PublicKey pk = certificate.getPublicKey();
        //getSignatureElement returns the <Signature> element of the XML returned from the web service
        Element signatureElement = getSignatureElement();
        if(null!=signatureElement) {
            DOMValidateContext context = new DOMValidateContext(pk, signatureElement);
            XMLSignatureFactory factory = XMLSignatureFactory.getInstance("DOM");
            XMLSignature signature = factory.unmarshalXMLSignature(context);

        }
  

Как я могу поступить после этого?

Комментарии:

1. Вы не можете изменить PDF-документ, добавив XML-ответ, который вы получаете от веб-сервиса, потому что это изменит PDF-документ, сделав подпись недействительной. Но вы можете сохранить PDF-документ и XML-подпись вместе в контейнере по вашему выбору. Затем этот контейнер содержит исходные данные (документ PDF) и подпись для этого (подпись XML).

2. не могли бы вы предоставить пример кода использования контейнера? Вы имеете в виду реализацию, аналогичную ExternalSignatureContainer ?

3. Нет, просто обычный новый класс с двумя полями: одно для содержимого PDF-документа, другое для подписи. Что-то вроде class Container { private byte[] documentData; private byte[] xmlSignature } .

4. Но это не подписывает мой документ. Я хочу подписать документ подписью Xml, которую я получаю от webservice. XMLSignature следует шаблону, например <Signature><SignedInfo></SignedInfo><SignatureValue></SignatureValue><KeyInfo></KeyInfo><Object></Object></Signature>

5. В PDF есть встроенная система цифровых подписей, которую вы можете использовать. Но тогда вам нужно проверить, поддерживает ли внешняя веб-служба подписи такую подпись, специфичную для PDF. Основываясь на том, что вы написали, похоже, что этот веб-сервис — это просто общий способ передачи данных / хэшей и возврата данных подписи. В зависимости от ваших требований к тому, как вы хотите подписать PDF, возможно, вы вообще не сможете использовать веб-сервис, но вам нужно добавить подробное описание вашего варианта использования в свой вопрос.