#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, возможно, вы вообще не сможете использовать веб-сервис, но вам нужно добавить подробное описание вашего варианта использования в свой вопрос.