Мне нужна ваша помощь ... Я пытаюсь проверить подпись документа xml ... Я подписал его, используя этот код:
Document doc = this.convertStringToDocument(manifestXmlStr);
XadesSigningProfile p = new XadesBesSigningProfile(this.kp);
XadesSigner signer = p.newSigner();
Enveloped e = new Enveloped(signer);
e.sign(doc.getDocumentElement());
String str = this.convertDocumentToString(doc);
return new SignResult(true, str);
, и я пытаюсь проверить подпись используя этот код:
byte[] encodedBytes = Base64.decode(manifest.getBytes()); //
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = null;
builder = factory.newDocumentBuilder();
Document doc = builder.parse(new InputSource(new StringReader(new String(encodedBytes))));
doc.getDocumentElement().normalize();
boolean validFlag = false;
NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");
if (nl.getLength() == 0) {
throw new Exception("No XML Digital Signature Found, document is discarded");
}
XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");
DOMValidateContextvalContext = new DOMValidateContext(metaDataService.getCertificateFromFile("certPath").getPublicKey(),nl.item(0));
Element el = (Element) (nl.item(0));
valContext.setIdAttributeNS(doc.getDocumentElement(), null, "Id");
XMLSignature signature = fac.unmarshalXMLSignature(valContext);
validFlag = signature.validate(valContext);
но этот код вызывает Exception
, говоря это:
m.m.a.ExceptionHandlerExceptionResolver : Resolved exception caused by
Handler execution: javax.xml.crypto.dsig.XMLSignatureException:
javax.xml.crypto.URIReferenceException:
com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolverException:
Cannot resolve element with ID
xmldsig-ee831f2d-d0d0-4b2e-9bd3-f8d5cc8c7cac-signedprops
Я попытался отладить его, он использует Идентификатор SignatureValue
тега xml, а не идентификатор тега подписи
Может кто-нибудь помочь мне решить эту проблему, пожалуйста. Спасибо