Estou realizando o processo de validação de assinatura digital no lado do servidor, recebendo um Lote deRPS. No momento da validação da assinatura do Lote de RPS a seguinte mensagem é apresentada. “javax.xml.crypto.dsig.XMLSignatureException: javax.xml.crypto.URIReferenceException: [com.sun.org.apache.xml.internal.security.utils.resolver.ResourceResolverException: Cannot resolve element with ID lote3936”
Segue código
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
org.w3c.dom.Document doc = dbf.newDocumentBuilder().parse(
new InputSource(new StringReader(xml)));
NodeList xmlAssinatura = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");
if (xmlAssinatura.getLength() == 0) {
throw new ValidateServiceException("Elemento Signature não encontrado");
}
DOMStructure dse = new DOMStructure(xmlAssinatura.item(1));
XMLSignatureFactory factory = XMLSignatureFactory.getInstance("DOM");
XMLSignature signature = factory.unmarshalXMLSignature(dse);
PublicKey publicKey = null;
List list = signature.getKeyInfo().getContent();
for (int i = 0; i < list.size(); i++) {
XMLStructure xs = (XMLStructure) list.get(i);
if (xs instanceof X509Data) {
for (Object data : ((X509Data) xs).getContent()) {
if (data instanceof java.security.cert.X509Certificate) {
publicKey = ((java.security.cert.X509Certificate) data).getPublicKey();
}
}
}
}
DOMValidateContext valContext = new DOMValidateContext(publicKey, xmlAssinatura.item(1));
XMLSignature xmlSignature = factory.unmarshalXMLSignature(valContext);
System.out.println("|- coreValidity" + xmlSignature.validate(valContext));
System.out.println("|- signature validation status:"
+ signature.getSignatureValue().validate(valContext));
Iterator i = xmlSignature.getSignedInfo().getReferences().iterator();
for (int j = 0; i.hasNext(); j++) {
Reference reference = ((Reference) i.next());
boolean refValid = reference.validate(valContext);
System.out.println("ref[" + j + "] validity status: " + refValid);
}
System.out.println("| Algoritmo assinatura: "
+ signature.getSignedInfo().getSignatureMethod().getAlgorithm());
System.out.println("| Algoritmo do certificado: " + publicKey.getAlgorithm());