Добавление SignedDataObjects (и, следовательно, добавление свойства proofOfApproval) в подписанную подпись

Я создаю подпись в оболочке с помощью xades4j, следуя этим утверждениям:

Element elemToSign = doc.getDocumentElement();
XadesSigner signer = new XadesTSigningProfile(...).newSigner();
new Enveloped(signer).sign(elemToSign);

Но мне нужно добавить в подпись и другие свойства, такие как ProofOfApprova и т. д.

Я вижу, что в примерах xades4j свойства proofOfApprovalProperties добавляются к обернутой подписи с использованием разных операторов подписи, например:

AllDataObjsCommitmentTypeProperty globalCommitment = AllDataObjsCommitmentTypeProperty.proofOfApproval();
CommitmentTypeProperty commitment = CommitmentTypeProperty.proofOfCreation();

DataObjectDesc obj1 = new DataObjectReference('#' + elemToSign.getAttribute("Id"))
    .withTransform(new EnvelopedSignatureTransform())
    .withDataObjectFormat(new DataObjectFormatProperty("text/xml", "MyEncoding")
    .withDescription("Isto é uma descrição do elemento raiz")
    .withDocumentationUri("http://doc1.txt")
    .withDocumentationUri("http://doc2.txt"))
    .withIdentifier("http://elem.root"))
    .withCommitmentType(commitment)
    .withDataObjectTimeStamp(dataObjsTimeStamp)

SignedDataObjects dataObjs = new SignedDataObjects(obj1)
    .withCommitmentType(globalCommitment);

signer.sign(dataObjs, elemToSign);

Я вижу здесь, что используется другая процедура подписи, а точнее оператор, в котором я создаю ссылку на DataObjectreference, в которой говорится, что я использую атрибут «Id» для корневого тега, для меня непригоден, потому что на входе я могу иметь любой вид XML-документа, и я не могу знать, какой атрибут (если он есть) я могу использовать для определения корневого тега.

Вкратце, могу ли я получить пример кода, в котором я создаю подпись Enveloped и добавляю свойство proofOfApproval, используя «new Enveloped (signer).sign (elemToSign);», или в любом случае, не зная исходной структуры xml?

Спасибо

M.


person Michele Bortolato    schedule 24.08.2012    source источник


Ответы (1)


Свойство proofOfApproval должно применяться к подписываемым объектам данных, поэтому необходимо использовать класс SignedDataObjects.

Класс Enveloped — это просто помощник для простых сценариев. Если я правильно понял, вы хотите подписать весь XML-документ. Спецификация XML-Signatures определяет, что пустой URI в ссылке (URI="") означает именно это. Если вы проверите код класса Enveloped, вы увидите, что он добавляет DataObjectReference с пустым uri.

Подводя итог, вам понадобится что-то вроде:

DataObjectDesc obj1 = new DataObjectReference("")
    .withTransform(new EnvelopedSignatureTransform())
    .withCommitmentType(CommitmentTypeProperty.proofOfApproval());
signer.sign(new SignedDataObjects(obj1), elemToSign);
person lgoncalves    schedule 24.08.2012
comment
Спасибо, вижу, работает. Но у меня есть еще кое-что, чтобы спросить (мне нужно завершить проект к середине сентября), не знаете ли вы, могу ли я добавить к элементу KeyInfo дополнительные свойства, такие как Keyvalue и/или X509IssuerName? Я не нашел ни одного примера об этом. Спасибо - person Michele Bortolato; 27.08.2012
comment
Пожалуйста, не задавайте новых вопросов в комментариях. Вместо этого вам следует задать новый вопрос, так вы с большей вероятностью получите ответ. - person Antoine Aubry; 07.09.2012
comment
@zuper - xades4j не включает эти теги, и в настоящее время нет возможности это контролировать. Он может быть включен в следующую версию. Если вам это действительно нужно, вы можете изменить код, включив тег. Элемент X509Data создается в классе KeyInfoBuilder. - person lgoncalves; 07.09.2012