Подписывание XML документа несколькими ЭЦП

Здравствуйте. В примерах которые были указаны в SDK показан пример подписывание и проверки XML файла только одним ЭЦП.

Я подписал XML с одним эцп. Потом подписал подписанный XML другим эцп и получил новый с двумя тегами ds:Signature. Но когда начал делать валидацию, валидация провалилась.

org.apache.xml.security.signature.Reference verify
WARNING: Verification failed for URI ""
org.apache.xml.security.signature.Reference verify
WARNING: Expected Digest: QQKhUATfCLJ9APvLb9cnblqFD6eibFZASajHLrutKWA=
org.apache.xml.security.signature.Reference verify
WARNING: Actual Digest: 1NMaKILlVeS2vazy7JWR89Lg+ypNvpGYIsT2IkOukjU=
Bad signature: Element 'ds:Reference' is not found in XML document
org.apache.xml.security.exceptions.XMLSecurityException: Cannot create an ElementProxy from a null argument

Возможно ли подписать один XML документ несколькими ЭЦП и держать их вместе в одном XML файле?

Разумно ли вообще подписывать один XML несколькими ЭЦП?

Добрый день!
Какую именно библиотеку и методы Вы использовали при формировании подписи и при ее проверке?

Да. Это вполне реально и разумно.

Здравствуйте. Использовал стандартный пример на Java который был XMLSignSample.java

Метод верификации в XMLSignSample.java это самый простой базовый пример. Он не будет покрывать все случаи.

Как вариант, в SDK есть вспомогательная библиотека knca_provider_util, в которой есть набор готовых методов для различных операций с XML подписью. Подробнее можете прочитать в документации этой библиотеки.

Спасибо за совет. У меня получилось подписывать XML через методы которых вы указали.

Вопрос такой, там для валидации через TSP требуется инстанс TimeStampToken. Как мне его создать от полученного серийного номера?

Посмотрите пример по получению метки времени в SDK.

Единственный способ в котором мне удалось хранить данные TimeStampToken это хранить его CMSSignedData как Base64

byte[] signedData = timeStampResponse.getTimeStampToken().toCMSSignedData().getEncoded();

String result = new String(Base64.getEncoder().encode(signedData))

Не совсем понятен вопрос, опишите пожалуйста проблему более подробно.

Я получил TimeStampToken от подписанного XML. Мне нужно каким то образом его хранить, чтобы если что его вытащить и проверить его с исходным XML. Единственный способ который я нашел это хранить его CMSSignedData как Base64.

Это разумно вообще хранить его?

CMSSignedData это подпись в формате CMS (CAdES). Нет смысла извлекать метку из XML подписи и вставлять в CMS подпись. Вы можете просто хранить саму XML подпись и извлекать метку только при верификации.