Assinar NFe gerada

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 .

envio de nfe?

na sua linha 149:

DOMSignContext dsc = new DOMSignContext(keyEntry.getPrivateKey(), doc.getDocumentElement());

eu faço assim:

DOMSignContext dsc = new DOMSignContext(keyEntry.getPrivateKey(), doc.getDocumentElement().getLastChild());

…acho que do meu jeito é meio gambiarra…rsrs

Deu certo nao cara,sera que tem outra dica ?
Ou alguem mas pode ajudar ?

Eai pessoal alguem pode dar uma forca?

Obas kra,

Aqui estamos desenvolvendo NF-e para a prefeitura-SP e a estrutura do XML está relativamente igual a sua. Não entendi pq a tag Signature está no lugar errado.

Amigo, percebi que si coloco a tag NFe como a raiz a assinatura fica legal.
Entao pegunto a tag procNFe deve ser a raiz do xml quando sai do meu aplicativo para receita, e quando me retorna ela vem com o procNFe?

Ibispo sabe colocar o namespace na tag nfe,acho que pode ser este o problema tambem tem este ns2:,sera que pode ma dar esta força?

ola roberto, eu sou meio ignorante, o que vc precisa?

Obrigado Ibispo pela disposicao em ajudar.
E que acho que o prblema pode estar em a tag do xml pois esta nao esta com namespace.
Voce sabe como add o namespace nesta tag?

Tambem gostaria de saber se quando gero meu xml ele deve conter como tag raiz ,pois se nao uso esta tag fica tudo certo .

Vamos lá,

Primeiro: Você está checando se o XML criado está de acordo com o schema. Por exemplo, aqui para eu criar o XML para a prefeitura-SP eu tive que checar se o XML está de acordo com o schema que baixei deles (arquivos .XSD)

Veja um método de exemplo para te ajudar

public static validarXMLporXSD(String nomeArqXML, String nomeArqXSD) { 
		 try { 
			 SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
			 // 
			 Schema schemaXSD = schemaFactory.newSchema(new File(nomeArqXSD)); 
			 Validator validator = schemaXSD.newValidator(); 
			 // 
			 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
			 dbf.setNamespaceAware(true); // Must enable namespace processing!! 
			 DocumentBuilder parser = dbf.newDocumentBuilder(); 
			 Document document = parser.parse(new File(nomeArqXML)); 
			 // 
			 validator.validate(new DOMSource(document)); 
			 // 
			 return true; 
		 } catch (Exception e) { 
			e.printStackTrace();  
		 } 
	 } 

Parametros: O arquivo XML e o arquivo XSD (schema). Com esse passo, você tem a certeza de que o arquivo está com as tags corretas.

Agora, se namespace são as informações que acompanham a tag (lembra q falei q sou meio ignorante), segue abaixo um exemplo de como acrescento isso no XML:


// -> Cria os elementos
Element tagPedidoEnvioRPS = document.createElement("PedidoEnvioRPS");
Element tagCabecalho = document.createElement("Cabecalho");
Element tagCPFCNPJRemetente = document.createElement("CPFCNPJRemetente");
Element tagCNPJRem = document.createElement("CNPJ");

// -> Adiciona 1 atributo
tagPedidoEnvioRPS.setAttribute("xmlns", "http://www.prefeitura.sp.gov.br/nfe");

// -> Adiciona 2 atributos
tagCabecalho.setAttribute("Versao", "1");
tagCabecalho.setAttribute("xmlns", "");

// -> Coloco o valor do atributo
tagCNPJRem.setTextContent("00.000.000/0000-00");

// -> Adiciono os filhos aos pais
tagCPFCNPJRemetente.appendChild(tagCNPJRem);
tagCabecalho.appendChild(tagCPFCNPJRemetente);
tagPedidoEnvioRPS.appendChild(tagCabecalho);

document.appendChild(tagPedidoEnvioRPS);

os imports (coloquei todos)


import java.io.*;
import java.security.KeyStore;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.w3c.dom.Document;
import org.w3c.dom.Element;

import org.xml.sax.*;

import com.sun.org.apache.xml.internal.serialize.OutputFormat;
import com.sun.org.apache.xml.internal.serialize.XMLSerializer;

import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.*;
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.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;

Espero ter ajudado.
Dúvidas é só postar.

Obrigado pela força,vou testar e depois te dou um retorno .

roberto.sampaio

Conseguiu assinar sua NFe no modelo 2.0?

Eu ate postei aqui no forum http://www.guj.com.br/posts/list/214222.java

Esta faltando somente isso para terminar o meu sistema.