Boa tarde a todos,
pesquisei no forum sobre manipulação de xml, encontrei muita coisa que me ajudou bastante a começar a trabalhar com XML.
Porem cheguei a um ponto onde não consegui uma solução.
Preciso assinar o xml da NFe que será enviado ao cliente. E preciso adicionar as tag’s ref. ao protocolo de autorização dessa NFe.
O que eu preciso é juntar dois xml’s um deles é os dados da NFe do cliente ja assinada, outro é as informações do protocolo de autorização dessa NFe.
Como posso fazer isso ?
Você já sabe como assinar?
http://today.java.net/pub/a/today/2006/11/21/xml-signature-with-jsr-105.html?page=1
http://portalnfe.fazenda.mg.gov.br/download.html
http://www.testexpert.com.br/?q=node/999
https://www.certisign.com.br/treinamento/guias-gratuitos/pdf/WebServices.pdf
http://javafree.uol.com.br/noticia/2615/
http://developers.sun.com/appserver/reference/techart/mutual_auth.html
Sim, tenho uma classe que ja faz a assinatura digital no xml.
Porem minha classe assina essa estrutura de xml.
-
{ demais tag’s do xml }
{ Assinatura digital, faz a assinatura corretamente. Inclusive posso visualizar e validar, no programa visualizador fornecido pela receita }
Mas para o xml que vai para o Destinatario, que começa com :
....Dessa forma quando gero as tag’s ref. ao dados do protocolo de autorização e mando fazer assinatura digital, as informações da assinatura digital fica fora da tag NFe.
Meu método de assinatura é esse :
public static String assinarEnviNFe(String xml, String localXMLCliente) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = factory.newDocumentBuilder().parse(new ByteArrayInputStream(xml.getBytes()));
XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");
ArrayList transformList = new ArrayList();
TransformParameterSpec tps = null;
Transform envelopedTransform = fac.newTransform(Transform.ENVELOPED, tps);
Transform c14NTransform = fac.newTransform("http://www.w3.org/TR/2001/REC-xml-c14n-20010315", tps);
transformList.add(envelopedTransform);
transformList.add(c14NTransform);
File certificado = new File( System.getProperty("user.dir") + "/certificados/certificado_cliente.pfx");
String password = criptSenha.decriptografarSenha( config.getSenhaAssDig());
KeyStore ks = KeyStore.getInstance("PKCS12");
char[] pwd = password.toCharArray();
InputStream is = new FileInputStream( certificado );
ks.load(is, pwd);
KeyStore.PrivateKeyEntry pkEntry = null;
Enumeration aliasesEnum = ks.aliases();
PrivateKey privateKey = null;
while (aliasesEnum.hasMoreElements()) {
String alias = (String) aliasesEnum.nextElement();
System.out.println("Alias: " + alias);
if (ks.isKeyEntry(alias)) {
pkEntry = (KeyStore.PrivateKeyEntry) ks
.getEntry(alias, new KeyStore.PasswordProtection(
criptSenha.decriptografarSenha(config.getSenhaAssDig()).toCharArray()));
privateKey = pkEntry.getPrivateKey();
break;
}
}
X509Certificate cert = (X509Certificate) pkEntry.getCertificate();
KeyInfoFactory kif = fac.getKeyInfoFactory();
List x509Content = new ArrayList();
x509Content.add(cert);
X509Data xd = kif.newX509Data(x509Content);
KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));
NodeList elements = doc.getElementsByTagName("infNFe");
Element el = (Element) elements.item(0);
String id = el.getAttribute("Id");
Reference ref = fac.newReference("#".concat(id), fac.newDigestMethod(DigestMethod.SHA1, null), transformList, null, null);
SignedInfo si = fac.newSignedInfo(fac.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE, (C14NMethodParameterSpec) null), fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null), Collections.singletonList(ref));
XMLSignature signature = fac.newXMLSignature(si, ki);
DOMSignContext dsc = new DOMSignContext( privateKey, doc.getDocumentElement());
System.out.println(dsc.toString());
signature.sign(dsc);
OutputStream os = new FileOutputStream( localXMLCliente );
TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(os));
ByteArrayOutputStream os2 = new ByteArrayOutputStream();
TransformerFactory tf2 = TransformerFactory.newInstance();
Transformer trans2 = tf2.newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(os2));
return os2.toString();
}