Olá pessoal,
Estou desenvolvendo uma aplicação Java para assinar arquivos XML de NFe. Sei que isso já foi discutido aqui em outros tópicos, mais mesmo consultando-os não consegui resolver meu problema.
Meu arquivo XML está sendo assinado, no entanto na seção Transforms da Assinatura digital, está aparecendo somente um transform (isso dá erro ao validar a NFe).
Exemplo:
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
</Transforms>
Enquanto o correto seria:
<Transforms>
<Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
</Transforms>
O meu código de gerar assinatura está abaixo: Peço que me falem o que está errado, se possível me dê um exemplo, pois meu Java é meio básico ainda…
Codigo de Assinatura:
//DECLARAÇÃO / INSTANCIAÇÃO DAS VARIÁVEIS
String input = args [ 0 ];
String certificado = args [ 1 ];
String cert_alias = args [ 2 ];
String cert_pass = args [ 3 ];
String cert_X509 = args [ 4 ];
String providerName = System.getProperty("jsr105Provider",
"org.jcp.xml.dsig.internal.dom.XMLDSigRI");
XMLSignatureFactory fac =
XMLSignatureFactory.getInstance("DOM",
(Provider) Class.forName(providerName).newInstance());
DocumentBuilderFactory dbf =
DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
Document doc =
dbf.newDocumentBuilder().
parse(new FileInputStream(input));
// OBTEM O ID DA NOTA FISCAL QUE SERÁ ASSINADA
NodeList elements = doc.getElementsByTagName("infNFe");
Element el = (Element) elements.item(i);
String id = el.getAttribute("Id");
Reference ref =
fac.newReference("#" + id,
fac.newDigestMethod(DigestMethod.SHA1, null),
Collections.singletonList(
fac.newTransform(Transform.ENVELOPED, (TransformParameterSpec)null)),
null, null);
SignedInfo si = fac.newSignedInfo
(fac.newCanonicalizationMethod
(CanonicalizationMethod.INCLUSIVE,
(C14NMethodParameterSpec) null),
fac.newSignatureMethod(SignatureMethod.RSA_SHA1,
null),
Collections.singletonList(ref));
PrivateKey privateKey = null;
privateKey = KeyStoreInfo.getPrivateKeyFromFile(certificado,cert_alias,cert_pass);
KeyInfo ki = null;
KeyInfoFactory kif = fac.getKeyInfoFactory();
CertificateFactory cf = CertificateFactory.getInstance("X.509");
FileInputStream fis = new FileInputStream(cert_X509);
java.security.cert.Certificate cert = cf.generateCertificate(fis);
fis.close();
X509Data x509d = kif.newX509Data (Collections.singletonList(cert));
ki = kif.newKeyInfo(Collections.singletonList(x509d));
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(512);
KeyPair kp = kpg.generateKeyPair();
DOMSignContext dsc = new DOMSignContext
(kp.getPrivate(), doc.getDocumentElement());
XMLSignature signature = fac.newXMLSignature(si, ki);
signature.sign(dsc);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
trans.transform(
new DOMSource(doc),
new StreamResult(
new FileOutputStream(output)));
}
}
qualquer ajuda é bem vinda! estou desesperado e ficando careca!