Boa tarde senhores, estou com o seguinte problema, quando assino o xml a tag signature nao fica dentro de NFe e sim fora abaixo de protNFe.Abaixo estou colocando o codigo da assinador,gerador xml e anexo um xml.
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
//codigo para gerar nfe mas metodo main para teste
package br.com.orion.nfe;
import br.com.orion.nfe.assinador.AssXML;
import br.com.orion.nfe.util.Utilidades;
import br.inf.portalfiscal.nfe.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.stream.StreamSource;
import org.w3._2000._09.xmldsig_.SignatureType;
/**
*
* @author Roberto
* @dia 21/07/2010
*/
public class GeraXml {
/*
* Metodo que gera a nfe para ser posteriormente
* assinada e enviada a sefaz .
* Tem com parametros om obj TNFe e TProtNFe que sao os nos principais da raiz nfeProc .
**/
public void xmlNfe(TNFe nfe, String tpAmb, String CertDig, String senha, String tpOpr) throws JAXBException, FileNotFoundException, Exception {
SimpleDateFormat formata = new SimpleDateFormat("yyyy-MM-dd HH:MM:SS");
Random rd = new Random();
String cn = "";
System.out.println("teste");
Utilidades util = new Utilidades();
TNfeProc procnfe = new TNfeProc();
AssXML ass = new AssXML();
int numero = rd.nextInt(99999999);
cn = String.valueOf(numero);
System.out.println("teste");
JAXBContext context = JAXBContext.newInstance("br.inf.portalfiscal.nfe");
TProtNFe prot = new TProtNFe();
prot.setInfProt(new TProtNFe.InfProt());
nfe.getInfNFe().getIde().setTpEmis("1");//tipo de emissao,normal,contigencia ..
nfe.getInfNFe().getIde().setTpAmb(tpAmb);
nfe.getInfNFe().getIde().setSerie("001");
nfe.getInfNFe().getIde().setTpImp("1");//tipo de impressao do danfe
nfe.getInfNFe().getIde().setVerProc("teste 1.0");
nfe.getInfNFe().getIde().setDhCont(formata.format(new Date()));
nfe.getInfNFe().setVersao("2.10");
nfe.getInfNFe().getIde().setCNF(cn);//codigo gerado
nfe.getInfNFe().getIde().setCDV(Utilidades.calcDVChaveAcesso(util.gerarKey(nfe, cn)));//dig verificador
nfe.getInfNFe().getIde().setMod("55");
nfe.getInfNFe().getIde().setProcEmi("0");
// nfe.setSignature(new SignatureType());
prot.setVersao("2.10");
prot.getInfProt().setTpAmb(tpAmb);
prot.getInfProt().setVerAplic("1.10");
prot.getInfProt().setChNFe(util.gerarKey(nfe, cn) + nfe.getInfNFe().getIde().getCDV());//chave nfe
nfe.getInfNFe().setId("NFE" + prot.getInfProt().getChNFe());
// nfe.setSignature(new SignatureType());
File file1 = new File("C:/" + prot.getInfProt().getChNFe() + "-nfe.xml");//novo arquivo xml com nome segundo schema
Marshaller msl = context.createMarshaller();
procnfe.setProtNFe(prot);
procnfe.setNFe(nfe);
//gera nfe
msl.marshal(procnfe, new FileOutputStream(file1));
ass.assinar("C:/" + prot.getInfProt().getChNFe() + "-nfe.xml", CertDig, senha, tpOpr);
}
public static void main(String[] args) throws JAXBException, FileNotFoundException {
SimpleDateFormat formata = new SimpleDateFormat("yyyy-MM-dd");//pego digitos mes e dois ultimos ano
String data = formata.format(new Date());
GeraXml xml = new GeraXml();
TNFe nfe = new TNFe();
nfe.setInfNFe(new TNFe.InfNFe());
//cabecalho do arquivo
nfe.getInfNFe().setIde(new TNFe.InfNFe.Ide());
nfe.getInfNFe().getIde().setCUF("31");
nfe.getInfNFe().getIde().setNatOp("venda a vista");
nfe.getInfNFe().getIde().setIndPag("0");//indicador de forma de PG 0 a vista,1 prazo 2 outros
nfe.getInfNFe().getIde().setNNF("123456");
nfe.getInfNFe().getIde().setDEmi(data);
nfe.getInfNFe().getIde().setDSaiEnt(data);
nfe.getInfNFe().getIde().setFinNFe("1");
//fim da ide(identificacao da nota)
nfe.getInfNFe().setEmit(new TNFe.InfNFe.Emit());
nfe.getInfNFe().getEmit().setCNPJ("10303789000103");
nfe.getInfNFe().getEmit().setXNome("Supply Distribuidora");
nfe.getInfNFe().getEmit().setXFant("Aliar");
TEnderEmi endereco = new TEnderEmi();
endereco.setXLgr("Av Socrates");
endereco.setNro("23");
endereco.setXCpl("Galpao");
endereco.setXBairro("Cinco");
endereco.setCMun("31880");
endereco.setXMun("Contagem");
endereco.setUF(TUfEmi.MG);
endereco.setCEP("31660510");
endereco.setCPais("1058");
endereco.setXPais("BRASIL");
endereco.setFone("34531089");
nfe.getInfNFe().getEmit().setEnderEmit(endereco);
nfe.getInfNFe().getEmit().setIE("1234567890");
//fim dados emitente
nfe.getInfNFe().setDest(new TNFe.InfNFe.Dest());
nfe.getInfNFe().getDest().setCNPJ("10303789000194");
nfe.getInfNFe().getDest().setXNome("Supply Filial");
TEndereco enderDest = new TEndereco();
enderDest.setXLgr("Av Socrates");
enderDest.setNro("23");
enderDest.setXCpl("Galpao");
enderDest.setXBairro("Cinco");
enderDest.setCMun("31880");
enderDest.setXMun("Contagem");
enderDest.setUF(TUf.MG);
enderDest.setCEP("31660510");
enderDest.setCPais("1058");
enderDest.setXPais("BRASIL");
enderDest.setFone("34531089");
nfe.getInfNFe().getDest().setEnderDest(enderDest);
nfe.getInfNFe().getDest().setIE("1234567890");
//fim dados destinatario
TNFe.InfNFe.Det det = new TNFe.InfNFe.Det();
det.setNItem("1");
TNFe.InfNFe.Det.Prod prod = new TNFe.InfNFe.Det.Prod();
prod.setCProd("12");
prod.setCEAN("789630123456");
prod.setXProd("Toddy");
prod.setNCM("1234456");
prod.setCFOP("5102");
prod.setUCom("UN");
prod.setQCom("200");
prod.setVUnCom("200");
prod.setVProd("1.00");
prod.setUTrib("UN");
prod.setQTrib("200");
prod.setVUnTrib("1.00");
prod.setVFrete("10.00");
prod.setVSeg("5.00");
//fim dados produtos
TNFe.InfNFe.Det.Imposto imp = new TNFe.InfNFe.Det.Imposto();
TNFe.InfNFe.Det.Imposto.ICMS icms = new TNFe.InfNFe.Det.Imposto.ICMS();
icms.setICMS00(new TNFe.InfNFe.Det.Imposto.ICMS.ICMS00());
icms.getICMS00().setOrig("0");
icms.getICMS00().setCST("00");
icms.getICMS00().setModBC("3");
icms.getICMS00().setVBC("40.00");
icms.getICMS00().setPICMS("18.00");
icms.getICMS00().setVICMS("90.00");
TNFe.InfNFe.Det.Imposto.PIS pis = new TNFe.InfNFe.Det.Imposto.PIS();
pis.setPISAliq(new TNFe.InfNFe.Det.Imposto.PIS.PISAliq());
pis.getPISAliq().setCST("01");
pis.getPISAliq().setVBC("40.40");
pis.getPISAliq().setPPIS("0.87");
pis.getPISAliq().setVPIS("0.25");
TNFe.InfNFe.Det.Imposto.COFINS cofins = new TNFe.InfNFe.Det.Imposto.COFINS();
cofins.setCOFINSAliq(new TNFe.InfNFe.Det.Imposto.COFINS.COFINSAliq());
cofins.getCOFINSAliq().setCST("01");
cofins.getCOFINSAliq().setVBC("40.00");
cofins.getCOFINSAliq().setPCOFINS("3.00");
cofins.getCOFINSAliq().setVCOFINS("1.20");
imp.setCOFINS(cofins);
imp.setPIS(pis);
imp.setICMS(icms);
det.setProd(prod);
nfe.getInfNFe().getDet().add(det);
//fim dados det
nfe.getInfNFe().setTotal(new TNFe.InfNFe.Total());
nfe.getInfNFe().getTotal().setICMSTot(new TNFe.InfNFe.Total.ICMSTot());
nfe.getInfNFe().getTotal().getICMSTot().setVBC("40.00");
nfe.getInfNFe().getTotal().getICMSTot().setVICMS("0.00");
nfe.getInfNFe().getTotal().getICMSTot().setVBCST("0.00");
nfe.getInfNFe().getTotal().getICMSTot().setVST("0.00");
nfe.getInfNFe().getTotal().getICMSTot().setVProd("10.00");
nfe.getInfNFe().getTotal().getICMSTot().setVFrete("8.00");
nfe.getInfNFe().getTotal().getICMSTot().setVSeg("0.00");
nfe.getInfNFe().getTotal().getICMSTot().setVDesc("23.34");
nfe.getInfNFe().getTotal().getICMSTot().setVII("0.00");
nfe.getInfNFe().getTotal().getICMSTot().setVIPI("23.34");
nfe.getInfNFe().getTotal().getICMSTot().setVPIS("0.00");
nfe.getInfNFe().getTotal().getICMSTot().setVCOFINS("1.34");
nfe.getInfNFe().getTotal().getICMSTot().setVOutro("0.00");
nfe.getInfNFe().getTotal().getICMSTot().setVNF("40.00");
//fim dados total
nfe.getInfNFe().setTransp(new TNFe.InfNFe.Transp());
nfe.getInfNFe().getTransp().setModFrete("0");
//fim dados transporte
nfe.getInfNFe().setCobr(new TNFe.InfNFe.Cobr());
nfe.getInfNFe().getCobr().setFat(new TNFe.InfNFe.Cobr.Fat());
nfe.getInfNFe().getCobr().getFat().setNFat("1");
nfe.getInfNFe().getCobr().getFat().setVOrig("40.00");
nfe.getInfNFe().getCobr().getFat().setVLiq("40.000");
TNFe.InfNFe.Cobr.Dup dup = new TNFe.InfNFe.Cobr.Dup();
dup.setNDup("1");
dup.setDVenc(data);
dup.setVDup("40.000");
nfe.getInfNFe().getCobr().getDup().add(dup);
try {
xml.xmlNfe(nfe, "1", "H:/Projeto NFe/NF-e Java/Certificados/associacao.p12", "123", "1");
} catch (Exception ex) {
ex.getMessage();
}
}
}
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package br.com.orion.nfe.assinador;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.security.KeyStore;
import java.security.Provider;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.xml.crypto.dsig.CanonicalizationMethod;
import javax.xml.crypto.dsig.DigestMethod;
import javax.xml.crypto.dsig.Reference;
import javax.xml.crypto.dsig.SignatureMethod;
import javax.xml.crypto.dsig.SignedInfo;
import javax.xml.crypto.dsig.Transform;
import javax.xml.crypto.dsig.XMLSignature;
import javax.xml.crypto.dsig.XMLSignatureFactory;
import javax.xml.crypto.dsig.dom.DOMSignContext;
import javax.xml.crypto.dsig.dom.DOMValidateContext;
import javax.xml.crypto.dsig.keyinfo.KeyInfo;
import javax.xml.crypto.dsig.keyinfo.KeyInfoFactory;
import javax.xml.crypto.dsig.keyinfo.X509Data;
import javax.xml.crypto.dsig.spec.C14NMethodParameterSpec;
import javax.xml.crypto.dsig.spec.TransformParameterSpec;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
//import sun.misc.BASE64Encoder;
import java.util.Enumeration;
public class AssXML {
private static final String C14N_TRANSFORM_METHOD = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315";
private static final String PROVIDER_CLASS_NAME = "org.jcp.xml.dsig.internal.dom.XMLDSigRI";
private static final String PROVIDER_NAME = "jsr105Provider";
public void assinar(String caminhoXml, String caminhoCertificado, String senha, String tipo) throws FileNotFoundException,Exception {
// tipo
// '1' - NFE
// '2' - CANCELAMENTO
// '3' - INUTILIZACAO
//
String tag = "";
if (tipo.equals("1")) {
tag = "infNFe";
} else if (tipo.equals("2")) {
tag = "infCanc";
} else if (tipo.equals("3")) {
tag = "infInut";
}
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(false);
DocumentBuilder builder = factory.newDocumentBuilder();
Document docs = builder.parse(new File(caminhoXml));
//Document docs = builder.parse(new File("c:/xml/430802017886010001735500000000010000030371-nfe.xml"));
// Obtem elemento do documento a ser assinado, será criado uma
// REFERENCE para o mesmo
NodeList elements = docs.getElementsByTagName(tag);
Element el = (Element) elements.item(0);
String id = el.getAttribute("Id");
//System.out.println(id);
// Create a DOM XMLSignatureFactory that will be used to
// generate the enveloped signature.
String providerName = System.getProperty(PROVIDER_NAME, PROVIDER_CLASS_NAME);
XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", (Provider) Class.forName(providerName).newInstance());
//XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM", new org.jcp.xml.dsig.internal.dom.XMLDSigRI());
// Create a Reference to the enveloped document (in this case,
// you are signing the whole document, so a URI of "" signifies
// that, and also specify the SHA1 digest algorithm and
// the ENVELOPED Transform.
ArrayList transformList = new ArrayList();
TransformParameterSpec tps = null;
Transform envelopedTransform = fac.newTransform(Transform.ENVELOPED, tps);
Transform c14NTransform = fac.newTransform(C14N_TRANSFORM_METHOD, tps);
transformList.add(envelopedTransform);
transformList.add(c14NTransform);
Reference ref = fac.newReference("#" + id, fac.newDigestMethod(DigestMethod.SHA1, null), transformList, null, null);
// Create the SignedInfo.
SignedInfo si = fac.newSignedInfo(fac.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE, (C14NMethodParameterSpec) null), fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null), Collections.singletonList(ref));
// Load the KeyStore and get the signing key and certificate.
///Provider p = new sun.security.pkcs11.SunPKCS11("c:/taliam/sclara.cer");
//Security.addProvider(p);
//KeyStore ks = KeyStore.getInstance("PKCS11");
//ks.load(null, new String("safeweb").toCharArray());
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(new FileInputStream(caminhoCertificado), senha.toCharArray());
Enumeration aliasesEnum = ks.aliases();
String alias = "";
while (aliasesEnum.hasMoreElements()) {
alias = (String) aliasesEnum.nextElement();
if (ks.isKeyEntry(alias)) {
//System.out.println(alias);
break;
}
}
// Original
//KeyStore ks = KeyStore.getInstance("JKS");
//ks.load(new FileInputStream("santaclara.jks"), "RAIMUNDO".toCharArray());
//
KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(alias, new KeyStore.PasswordProtection(senha.toCharArray()));
X509Certificate cert = (X509Certificate) keyEntry.getCertificate();
// Create the KeyInfo containing the X509Data.
KeyInfoFactory kif = fac.getKeyInfoFactory();
List x509Content = new ArrayList();
// x509Content.add(cert.getSubjectX500Principal().getName());
x509Content.add(cert);
X509Data xd = kif.newX509Data(x509Content);
KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));
// Instantiate the document to be signed.
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
Document doc = dbf.newDocumentBuilder().parse(new FileInputStream(caminhoXml));
// Create a DOMSignContext and specify the RSA PrivateKey and
// location of the resulting XMLSignature's parent element.
DOMSignContext dsc = new DOMSignContext(keyEntry.getPrivateKey(), doc.getDocumentElement());
// Create the XMLSignature, but don't sign it yet.
XMLSignature signature = fac.newXMLSignature(si, ki);
// Marshal, generate, and sign the enveloped signature.
signature.sign(dsc);
// Output the resulting document.
OutputStream os = new FileOutputStream(caminhoXml);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(os));
// Find Signature element.
NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");
if (nl.getLength() == 0) {
throw new Exception("Cannot find Signature element");
}
// Create a DOMValidateContext and specify a KeySelector and document
// context.
DOMValidateContext valContext = new DOMValidateContext(new X509KeySelector(ks), nl.item(0));
// Unmarshal the XMLSignature.
XMLSignature signatures = fac.unmarshalXMLSignature(valContext);
// Validate the XMLSignature.
boolean coreValidity = signatures.validate(valContext);
// Check core validation status.
if (coreValidity == false) {
System.err.println("Falha na Assinatura!");
} else {
System.out.println("Assinatura Correta!");
}
} catch (Exception ex) {
ex.getMessage();
}
}
}
Galera aguardo esta forca .