org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR
Я слишком долго смотрю на это и не могу понять, что я делаю неправильно.
Итак, я пытаюсь сгенерировать подпись Xades для некоторого контента. К сожалению, я всегда сталкиваюсь с одной и той же ошибкой: "HIERARCHY_REQUEST_ERR". Это мой документ XML:
<?xml version="1.0" encoding="UTF-8"?>
<object>
<request id="f9e1294a-64b7-488b-b475-7511e317e399">(some arbitrary base64 encoded content)</request>
</object>
Я пытаюсь подписать элемент "Запрос" (очевидно...), с помощью следующего кода:
/*create a document*/
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.newDocument();
Element objectElement = doc.createElement("object");
doc.appendChild(objectElement);
Element requestElement = doc.createElement("request");
requestElement.appendChild(doc.createTextNode(decodedContent));
requestElement.setAttribute("id", UUID.randomUUID().toString());
objectElement.appendChild(requestElement);
/*Key provider, signing profile & signer itself*/
KeyingDataProvider kp = new CustomKeyingDataProvider(certificate, privateKey);
XadesSigningProfile p = new XadesTSigningProfile(kp);
XadesSigner signer = p.newSigner();
/*Signed data*/
DataObjectDesc flatFile = new DataObjectReference("#" + requestElement.getAttribute("id"))
.withTransform(new GenericAlgorithm("http://www.w3.org/2000/09/xmldsig#base64"))
.withDataObjectTimeStamp();
SignedDataObjects dataObjs = new SignedDataObjects(flatFile).withCommitmentType(AllDataObjsCommitmentTypeProperty.proofOfOrigin());
/*Actual signing*/
signer.sign(dataObjs, doc);
Я получаю эту ошибку в ответ (сокращенно до того, что было необходимо):
class org.w3c.dom.DOMException: org.w3c.dom.DOMException: HIERARCHY_REQUEST_ERR: An
attempt was made to insert a node where it is not permitted.
at org.apache.xerces.dom.CoreDocumentImpl.insertBefore(Unknown Source)
at org.apache.xerces.dom.NodeImpl.appendChild(Unknown Source)
at xades4j.production.AppendAsLastChildStrategy.append(SignatureAppendingStrategies.java:55)
at xades4j.production.SignerBES.sign(SignerBES.java:210)
at xades4j.production.SignerBES.sign(SignerBES.java:122)
...
Я искал в Интернете, но единственная похожая ошибка, которую я обнаружил, была следующей: https://code.google.com/p/xades4j/wiki/QeA (почти сверху). Я не могу найти ответ на его вопрос, но, насколько я вижу, мой документ XML содержит корневой элемент (как и его второй пример). Так что я не знаю, что я делаю не так...
Кто-нибудь может мне помочь? Заранее спасибо.
1 ответ
Вы пытаетесь добавить подпись в качестве корневого элемента документа, так как вы предоставляете doc
в качестве родителя на sign
метод. Однако в документе уже есть корневой элемент (object
), и только один разрешен.