2016-02-08 4 views
1

Мне нужно создать свою собственную подпись XAdES для проекта, и все работает отлично, за исключением отдельных подписей. Насколько я понимаю, мне нужно добавить ссылку на объект XML, который укажет на контейнер, в котором хранится исходный документ. Я пробовал как с ResolverAnonymous, так и с ResolverLocalFileSystem.Добавить ссылку на Resolver для отдельной записи XAdES

XMLSignature sig = new XMLSignature(docToBeSigned, "", sigAlgorithm); 
Element element = sig.getElement(); 

//adding signedinfo, keyinfo and xades properties in between 

ResolverLocalFilesystem resolver = new ResolverLocalFilesystem(); 
//ResolverAnonymous resolver = new ResolverAnonymous(documentToSign); 
sig.addResourceResolver(resolver); 

sig.addDocument("DetachedObjectReference-1", null, 
ESIGUtils.algorithmIDtoURN(hashAlgorithmID), /* it sends the corresponding SHA-1 URL */ 
SignedDataObject-Reference", null); 

Element objeto = docToBeSigned.createElement("ds:Object"); 
objeto.setAttribute("Id", "Object-1"); 

element.appendChild(objeto); 

sig.sign(privateKey); 

return docToBeSigned; 

ошибка я получаю следующим образом:

Original Exception was org.apache.xml.security.signature.ReferenceNotInitializedException: Could not find a resolver for URI DetachedObjectReference-1 and Base 
Original Exception was org.apache.xml.security.signature.ReferenceNotInitializedException: Could not find a resolver for URI DetachedObjectReference-1 and Base 
Original Exception was org.apache.xml.security.utils.resolver.ResourceResolverException: Could not find a resolver for URI DetachedObjectReference-1 and Base 

Может кто-нибудь сказать, где моя ошибка?

Заранее благодарен!

ответ

1

Хорошо, исправлено.

Существует идентификатор-идентификатор от Apache XML Security, который добавляет ссылку, которую я отсутствовал. Следующий код для добавления подписи должен быть добавлен для работы подписи:

Element objeto = docToBeSigned.createElementNS(
      Constants.SignatureSpecNS, "ds:Object"); 
    objeto.setAttributeNS(null, Constants._ATT_ID, "DetachedSignatureReference"); 
    IdResolver.registerElementById(objeto, "DetachedSignatureReference"); 

вместо распознавателей, которых я использовал.