Assinaturas de arquivos xml da NFe

[quote=Marilice]Segue a mensagem

PARSER XML: OK
TIPO DE MENSAGEM: Distribuição da NF-e processada
SCHEMA: OK
ASSINATURA XML: Assinatura INVÁLIDA[/quote]

Humm, assim fica dificil :slight_smile:

Por favor, envie um xml por aqui mesmo, assinado com erro.
Analiso ele para voce.

Alencar

Alencar

Obrigada por sua ajuda.

Alencar bom dia!

Aqui estou eu novamente, fiz as alterações conformE vc havia me orientado mas mesmo assim continua com o erro"ASSINATURA INVÁLIDA"

HELP-ME PLEASE

Cola o xml gerado pra gente ver e poder ajudar…

Vide mp

[quote=Marilice]Alencar bom dia!

Aqui estou eu novamente, fiz as alterações conformE vc havia me orientado mas mesmo assim continua com o erro"ASSINATURA INVÁLIDA"

HELP-ME PLEASE[/quote]

Manda novamente por email.
Desculpe a demora em responder. Por vezes nao estou online.

ALencar

Alencar muito bom dia!

Imagina ja agradeço pela atenção que todos me deram neste forum, mas cosegui resolver e gostaria de deixar a solução.

O problema estava na hora que gerava o xml a codificação estava como ANSI e o padrão é UTF-8, fiz o seguinte

Abri o arquivo xml no bloco de notas
Pedir para salvar como
Modifique a codificação de ANSI para UTF 8
Substitui o arquivo e pronto
Entrei no site sefaz rs
Assinatura válida

Um abraço a todos

eae camaradas, eu denovo, agora descobri que minha assinatura ta faltando uma tag, se alguem puder me ajudar agradeço, na validação acusa que falta a seguinte tag essa que coloco em negrito, essa realmente não consta na minha assinatura, mas sim nos xml nf-e de exemplo dareceita

abaixo lanço o cod. que uso pra assianr, saiu daqui mesmo do guj, são 2 classes obrigado.

package nfe.signature;

	import java.io.FileInputStream;
	import java.io.FileNotFoundException;
	import java.io.FileOutputStream;
	import java.io.IOException;
	import java.io.InputStream;
	import java.io.OutputStream;
	import java.security.KeyStore;
	import java.security.KeyStoreException;
	import java.security.NoSuchAlgorithmException;
	import java.security.PrivateKey;
	import java.security.UnrecoverableEntryException;
	import java.security.cert.CertificateException;
	import java.security.cert.X509Certificate;
	import java.util.ArrayList;
	import java.util.Collections;
	import java.util.Enumeration;
	import java.util.Iterator;

	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.DocumentBuilderFactory;
	import javax.xml.parsers.ParserConfigurationException;
	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 org.xml.sax.SAXException;


	public class AssinaXML {
		
		public static String keyStoreP12 = "PKCS12";
		public static String keyStoreJKS = "JKS";
		
		public static Reference ref = null;
		public static SignedInfo si = null;
		public static XMLSignature signature = null;
		public static DOMSignContext dsc = null;
		
		private String certificadoArquivo = "";
		private String certificadoSenha = "";
		private String arquivoEntrada = "";
		private String arquivoSaida = "";
		private String keyStore = "";
		
		public AssinaXML(String arquivoCertificado, String senhaCertificado,
				String arquivoEntradaXML, String arquivoSaidaXML, String keyStore){
			this.certificadoArquivo = arquivoCertificado;
			this.certificadoSenha = senhaCertificado;
			this.arquivoEntrada = arquivoEntradaXML;
			this.arquivoSaida = arquivoSaidaXML;
			this.keyStore = keyStore;
		}
			
		public static XMLSignature getSignature() {
			return signature;
		}

		public static void setSignature(XMLSignature signature) {
			AssinaXML.signature = signature;
		}

		public String getCertificadoArquivo() {
			return certificadoArquivo;
		}

		public void setCertificadoArquivo(String certificadoArquivo) {
			this.certificadoArquivo = certificadoArquivo;
		}

		public String getCertificadoSenha() {
			return certificadoSenha;
		}

		public void setCertificadoSenha(String certificadoSenha) {
			this.certificadoSenha = certificadoSenha;
		}

		public String getArquivoEntrada() {
			return arquivoEntrada;
		}

		public void setArquivoEntrada(String arquivoEntrada) {
			this.arquivoEntrada = arquivoEntrada;
		}

		public String getArquivoSaida() {
			return arquivoSaida;
		}

		public void setArquivoSaida(String arquivoSaida) {
			this.arquivoSaida = arquivoSaida;
		}
		
		public String getKeyStore() {
			return keyStore;
		}

		public void setKeyStore(String keyStore) {
			this.keyStore = keyStore;
		}

		@SuppressWarnings("unchecked")
		public void colocaCertificado(){
			XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");
			try {
				
				KeyStore ks = KeyStore.getInstance(getKeyStore());
				ks.load(new FileInputStream(getCertificadoArquivo()), getCertificadoSenha().toCharArray());			
				KeyStore.PrivateKeyEntry keyEntry = null;
				
				for(Enumeration e = ks.aliases(); e.hasMoreElements();){ 
					keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry((String) e.nextElement(),
								new KeyStore.PasswordProtection(getCertificadoSenha().toCharArray()));
				}
				
				X509Certificate cert = (X509Certificate) keyEntry.getCertificate();
				KeyInfoFactory kif = fac.getKeyInfoFactory();
				ArrayList x509Content = new ArrayList();
				x509Content.add(cert);
				X509Data xd = kif.newX509Data(x509Content);
				KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));
	  
				DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
				dbf.setNamespaceAware(true);
		        Document doc = dbf.newDocumentBuilder().parse(new FileInputStream(getArquivoEntrada()));
				  
				dsc = new DOMSignContext(keyEntry.getPrivateKey(), doc.getDocumentElement());
				  	  
		        assinatura(fac, x509Content, keyEntry.getPrivateKey(), ki, doc);
				 
		        OutputStream os = new FileOutputStream(getArquivoSaida());
		          TransformerFactory tf = TransformerFactory.newInstance();
		          Transformer trans = tf.newTransformer();
		          trans.transform(new DOMSource(doc), new StreamResult(os));
				    
		          NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS, "Signature");
				            		  
				  if (nl.getLength() == 0){
				     throw new Exception("Nao encontrou elemento (TAG) Signature!!!");
		          }

		          DOMValidateContext valContext = new DOMValidateContext(new X509KeySelector(), nl.item(0));
		          
		          XMLSignature signature1 = fac.unmarshalXMLSignature(valContext);

		          boolean coreValidity = signature1.validate(valContext);
				  
		          if (coreValidity == false) {
		             System.err.println("Signature failed core validation");
		             boolean sv = signature.getSignatureValue().validate(valContext);
		             System.out.println("signature validation status: " + sv);
		             if (sv == false) {
		                Iterator i = signature.getSignedInfo().getReferences().iterator();
		                for (int j=0; i.hasNext(); j++) {
		                    boolean refValid = ((Reference) i.next()).validate(valContext);
		                    System.out.println("ref["+j+"] validity status: " + refValid);
		                }
		             }
		          }
				  else {
		             System.out.println("Signature passed core validation");
		          }
				  
				  valContext.setProperty("javax.xml.crypto.dsig.cacheReference", Boolean.TRUE);
				  XMLSignature signaturex = fac.unmarshalXMLSignature(valContext);
				  @SuppressWarnings("unused")
				boolean coreValidityx = signaturex.validate(valContext);
					
		          Iterator i = signature.getSignedInfo().getReferences().iterator();
				  for (int j=0; i.hasNext(); j++) {
					  @SuppressWarnings("unused")
					InputStream is = ((Reference) i.next()).getDigestInputStream();
				  }
				  
			} catch (KeyStoreException e) {				
				e.printStackTrace();
			} catch (NoSuchAlgorithmException e) {
				e.printStackTrace();
			} catch (CertificateException e) {
				e.printStackTrace();
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} catch (UnrecoverableEntryException e) {
				e.printStackTrace();
			} catch (SAXException e) {
				e.printStackTrace();
			} catch (ParserConfigurationException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
			
		}
		
		@SuppressWarnings("unchecked")
		private static void assinatura(XMLSignatureFactory fac,
	            ArrayList transformList,
	            PrivateKey privateKey,
	            KeyInfo ki,
	            Document doc
			    ) throws Exception {

			NodeList elements = doc.getElementsByTagName("infNFe");
			Element el = (org.w3c.dom.Element) elements.item(0);
			String id = el.getAttribute("Id");

			ref = fac.newReference("#" + id, fac.newDigestMethod(
	                  DigestMethod.SHA1, null),
				       Collections.singletonList (
				       fac.newTransform(Transform.ENVELOPED,
				      (TransformParameterSpec) null)), null, null);

			si = fac.newSignedInfo(fac.newCanonicalizationMethod(
	        CanonicalizationMethod.INCLUSIVE,
	       (C14NMethodParameterSpec) null),
		     fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null),
			     Collections.singletonList(ref));
			 
			DOMSignContext dsc = new DOMSignContext(privateKey,doc.getElementsByTagName("NFe").item(0));
			signature = fac.newXMLSignature(si, ki);
			signature.sign(dsc);
	}
		
		
		public static void main(String[] args) {
			AssinaXML ax3 = new AssinaXML("src/nfe/resources/Associacao.pfx", "associacao", 
					"src/nfe/resources/NF-e.xml",
					"src/nfe/resources/assinadas/NF-e.xml", AssinaXML.keyStoreP12);
			ax3.colocaCertificado();
		}

	}
package nfe.signature;

import java.security.Key;
import java.security.PublicKey;
import java.security.cert.X509Certificate;
import java.util.Iterator;

import javax.xml.crypto.AlgorithmMethod;
import javax.xml.crypto.KeySelector;
import javax.xml.crypto.KeySelectorException;
import javax.xml.crypto.KeySelectorResult;
import javax.xml.crypto.XMLCryptoContext;
import javax.xml.crypto.XMLStructure;
import javax.xml.crypto.dsig.SignatureMethod;
import javax.xml.crypto.dsig.keyinfo.KeyInfo;
import javax.xml.crypto.dsig.keyinfo.X509Data;

public class X509KeySelector extends KeySelector {
    
	@SuppressWarnings("unchecked")
	public KeySelectorResult select(KeyInfo keyInfo,
                                    KeySelector.Purpose purpose,
                                    AlgorithmMethod method,
                                    XMLCryptoContext context)
        throws KeySelectorException {
        Iterator ki = keyInfo.getContent().iterator();
        while (ki.hasNext()) {
            XMLStructure info = (XMLStructure) ki.next();
            if (!(info instanceof X509Data))
                continue;
            X509Data x509Data = (X509Data) info;
            Iterator xi = x509Data.getContent().iterator();
            while (xi.hasNext()) {
                Object o = xi.next();
                if (!(o instanceof X509Certificate))
                    continue;
                final PublicKey key = ((X509Certificate)o).getPublicKey();
                // Make sure the algorithm is compatible
                // with the method.
                if (algEquals(method.getAlgorithm(), key.getAlgorithm())) {
                    return new KeySelectorResult() {
                        public Key getKey() { return key; }
                    };
                }
            }
        }
        throw new KeySelectorException("No key found!");
    }

    static boolean algEquals(String algURI, String algName) {
        if ((algName.equalsIgnoreCase("DSA") &&
            algURI.equalsIgnoreCase(SignatureMethod.DSA_SHA1)) ||
            (algName.equalsIgnoreCase("RSA") &&
            algURI.equalsIgnoreCase(SignatureMethod.RSA_SHA1))) {
            return true;
        } else {
            return false;
        }
    }
}

Olha ai a parte do meu codigo que inclui as transformacoes exigidas:

			// C14N_TRANSFORM_METHOD
			String C14N_TRANSFORM_METHOD = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315";
			// Cria a lista de tranformações a serem aplicadas as referencias a
			// serem assinadas
			ArrayList transforms = new ArrayList();
			TransformParameterSpec tps = null;
			Transform envelopedTransform = fac.newTransform(Transform.ENVELOPED, tps);
			Transform c14NTransform = fac.newTransform(C14N_TRANSFORM_METHOD, tps);
			transforms.add(envelopedTransform);
			transforms.add(c14NTransform);

			// cria uma referencia ao envelope e define o algoritmo SHA1
			Reference ref = fac.newReference(URI, fac.newDigestMethod(
			    DigestMethod.SHA1, null), transforms, null, null);

Alencar

[quote=alves.Felipe]o problema que eu estava tendo é que depois de assinar o xml eu o gravava , e nessa hora eu alterava o xml… por isso
ficava errado a assinatura…
agora eu gravo eu não altero nada. mas antes de gravar eu transformo o Document para string e consumo o WS…
e agora foi… :slight_smile:

mas valeo pela força f-schmitt e philler …

[/quote]

pode me explicar isso melhor manu, porque eu to com o mesmo rolo, se puder ajudar agradeço, abraços.

Validando NOTA #1 do Lote NF-e: Assinatura INVÁLIDA

Apos o processo de assinatura, uso as linhas de cmd abaixo para transformar o Document em String:

			ByteArrayOutputStream os = new ByteArrayOutputStream();
			TransformerFactory tf = TransformerFactory.newInstance();
			Transformer trans = tf.newTransformer();
			trans.transform(new DOMSource(doc), new StreamResult(os));
			return os.toString();

onde “doc” é o Document tratado.

E depois assim para salvar em disco:

	public static boolean saveFile(String arqSaida, String conteudo) throws IOException {
		File file = new File(arqSaida);
		if (file.exists())
			file.delete();
		
		FileWriter fw = new FileWriter(file);
		fw.write(conteudo);
		fw.flush();
		fw.close();
		
		return true;
	}

Estou com o seguinte erro ao tentar assinar o xml:


java.lang.NullPointerException: signingKey cannot be null
        at javax.xml.crypto.dsig.dom.DOMSignContext.<init>(DOMSignContext.java:53)
        at br.com.peoplesolutions.nfeservice.assinador.TratadorCertificado.assinarDocumento(TratadorCertificado.java:151)
        at br.com.peoplesolutions.nfeservice.assinador.TratadorCertificado.main(TratadorCertificado.java:165)

Minha classe está assim:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.peoplesolutions.nfeservice.assinador;

/**
 *
 * @author Gilmar
 */
import java.security.*;
import java.security.Certificate;
import java.security.cert.*;
import java.io.*;
import java.util.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.crypto.dsig.*;
import javax.xml.crypto.dsig.dom.DOMSignContext;
import javax.xml.crypto.dsig.keyinfo.*;
import javax.xml.crypto.dsig.spec.*;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

public class TratadorCertificado {
    /*
     * 	Classe para tratamento de certificados. Deve fazer a manipulacao
     * dos certificados exportando chaves, assinando XML's e demais funcoes.
     *
     */

    public static final String algoritmo = "RSA";
    public static final String algoritmoAssinatura = "MD5withRSA";
    private static final String C14N_TRANSFORM_METHOD = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315";
    public static File file = new File("c:\\meuKeystore.jks");
    private static String alias = "meuAlias";
    private static char[] senha = "senhaKeystore".toCharArray();
    static XMLSignatureFactory sig;
    static X509Certificate cert;
    static KeyInfo ki;
    static SignedInfo si;
    static KeyStore rep;

    public static PrivateKey getChavePrivada() throws Exception {
        
        InputStream entrada = new FileInputStream(file);
        rep.load(entrada, senha);
        entrada.close();
        Key chavePrivada = (Key) rep.getKey(alias, senha);


        if (chavePrivada instanceof PrivateKey) {
        System.out.println("Chave Privada encontrada!");
        return (PrivateKey) chavePrivada;
        } else {
        System.out.println("NULL");
        return null;  // Está retornando null
        }
        
        
    }

    public static PublicKey getChavePublica() throws Exception {

        InputStream entrada = new FileInputStream(file);
        rep.load(entrada, senha);
        entrada.close();
        Key chave = (Key) rep.getKey(alias, senha);
        java.security.Certificate cert = (java.security.Certificate) rep.getCertificate(alias);//O tipo de dado é declarado desse modo por haver ambigüidade (Classes assinadas com o mesmo nome "Certificate")
        PublicKey chavePublica = cert.getPublicKey();
        System.out.println("Chave Pública encontrada!");
        return chavePublica;





    }

    public static boolean verificarAssinatura(PublicKey chave, byte[] buffer, byte[] assinado) throws Exception {

        Signature assinatura = Signature.getInstance(algoritmoAssinatura);
        assinatura.initVerify(chave);
        assinatura.update(buffer, 0, buffer.length);
        return assinatura.verify(assinado);
    }

    public static byte[] criarAssinatura(PrivateKey chavePrivada, byte[] buffer) throws Exception {

        Signature assinatura = Signature.getInstance(algoritmoAssinatura);
        assinatura.initSign(chavePrivada);
        assinatura.update(buffer, 0, buffer.length);
        return assinatura.sign();
    }

    public static String getValidade(X509Certificate cert) {
        try {
            cert.checkValidity();
            return "Certificado válido!";
        } catch (CertificateExpiredException e) {
            return "Certificado expirado!";
        } catch (CertificateNotYetValidException e) {
            return "Certificado inválido!";
        }
    }

    public static void getCertificado() throws Exception {
        InputStream dado = new FileInputStream(file);
        rep = KeyStore.getInstance("JKS");
        rep.load(dado, senha);
        cert = (X509Certificate) rep.getCertificate(alias);
        String retorno = TratadorCertificado.getValidade(cert);
        System.out.println(retorno);
    }

    public static void assinarDocumento(String localDocumento) throws Exception {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setNamespaceAware(true);
        Document doc = dbf.newDocumentBuilder().parse(new FileInputStream(localDocumento));
        System.out.println("Documento ok!");

        sig = XMLSignatureFactory.getInstance("DOM");

        ArrayList<Transform> transformList = new ArrayList<Transform>();
        Transform enveloped = sig.newTransform(Transform.ENVELOPED, (TransformParameterSpec) null);
        Transform c14n = sig.newTransform(C14N_TRANSFORM_METHOD, (TransformParameterSpec) null);
        transformList.add(enveloped);
        transformList.add(c14n);

        NodeList elements = doc.getElementsByTagName("infNFe");
        org.w3c.dom.Element el = (org.w3c.dom.Element) elements.item(0);
        String id = el.getAttribute("Id");
        Reference r = sig.newReference("#".concat(id), sig.newDigestMethod(DigestMethod.SHA1, null),
                transformList,
                null, null);
        si = sig.newSignedInfo(
                sig.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE,
                (C14NMethodParameterSpec) null),
                sig.newSignatureMethod(SignatureMethod.RSA_SHA1, null),
                Collections.singletonList(r));

        KeyInfoFactory kif = sig.getKeyInfoFactory();
        List x509Content = new ArrayList();
        x509Content.add(cert);
        X509Data xd = kif.newX509Data(x509Content);
        ki = kif.newKeyInfo(Collections.singletonList(xd));

        DOMSignContext dsc = new DOMSignContext(getChavePrivada(), doc.getDocumentElement());
        XMLSignature signature = sig.newXMLSignature(si, ki);
        signature.sign(dsc);
        OutputStream os = new FileOutputStream("assinado.xml");
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer trans = tf.newTransformer();
        trans.transform(new DOMSource(doc), new StreamResult(os));

    }

    public static void main(String[] args) {

        try {
            TratadorCertificado.getCertificado();
            TratadorCertificado.assinarDocumento("C:\\Documents and Settings\\Gilmar\\Desktop\\35090850559251000189550010000000010004001100-nfe.xml");
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

Meu certificado é do tipo .pfx

Estou usando essa ferramenta para criar o keystore http://yellowcat1.free.fr/index_ktl.html

Não sei se estou fazendo certo.
Tentei pela linha de comando e também não deu certo

Verifique se esta linha esta sendo executada:

System.out.println(“Chave Privada encontrada!”);

Pelo que entendi, vc esta tendo problemas em ler o jks.

Alencar

Consegui resolver de uma forma mais fácil graças a esses post do thingol http://www.guj.com.br/posts/list/15/87934.java

Usei o comando: keytool -list -storetype pkcs12 -keystore “Nfe emissor.pfx” e peguei o alias do meu .pfx

E mudei o método que pega a chave privada.

Ficou assim:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.peoplesolutions.nfeservice.assinador;

/**
 *
 * @author Gilmar
 */
import java.security.*;
import java.security.Certificate;
import java.security.cert.*;
import java.io.*;
import java.util.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.crypto.dsig.*;
import javax.xml.crypto.dsig.dom.DOMSignContext;
import javax.xml.crypto.dsig.keyinfo.*;
import javax.xml.crypto.dsig.spec.*;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

public class TratadorCertificado {
    /*
     * 	Classe para tratamento de certificados. Deve fazer a manipulacao
     * dos certificados exportando chaves, assinando XML's e demais funcoes.
     *
     */

    public static final String algoritmo = "RSA";
    public static final String algoritmoAssinatura = "MD5withRSA";
    private static final String C14N_TRANSFORM_METHOD = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315";
    public static File file = new File("c:\\NFe emissao.pfx");
    private static String alias = "7329c51b033a11c43842c2768e4974ea_9781a9e3-5b38-48a9-a28d-6443bfbf0f03"; // Esse foi o alias retornado pelo comando
    private static char[] senha = "senha_do_meu_arquivo.pfx".toCharArray();
    static XMLSignatureFactory sig;
    static X509Certificate cert;
    static KeyInfo ki;
    static SignedInfo si;
    static KeyStore rep;

    public static PrivateKey getChavePrivada() throws Exception {
        /*
        InputStream entrada = new FileInputStream(file);
        rep.load(entrada, senha);
        entrada.close();
        Key chavePrivada = (Key) rep.getKey(alias, senha);


        if (chavePrivada instanceof PrivateKey) {
        System.out.println("Chave Privada encontrada!");
        return (PrivateKey) chavePrivada;
        } else {
        System.out.println("NULLLLLLLL");
        return null;
        }
         */
        KeyStore ks = KeyStore.getInstance("PKCS12");
        FileInputStream fis = new FileInputStream(file);

//load the keystore
        ks.load(fis, senha);

//get the private key for signing.
        PrivateKey privateKey = (PrivateKey) ks.getKey(alias, senha);

        return privateKey;
    }

    public static PublicKey getChavePublica() throws Exception {
        KeyStore ks = KeyStore.getInstance("PKCS12");
        FileInputStream fis = new FileInputStream(file);

        //InputStream entrada = new FileInputStream(file);
        rep.load(fis, senha);
        fis.close();
        Key chave = (Key) rep.getKey(alias, senha);
        java.security.Certificate cert = (java.security.Certificate) rep.getCertificate(alias);//O tipo de dado é declarado desse modo por haver ambigüidade (Classes assinadas com o mesmo nome "Certificate")
        PublicKey chavePublica = cert.getPublicKey();
        System.out.println("Chave Pública encontrada!");
        return chavePublica;





    }

    public static boolean verificarAssinatura(PublicKey chave, byte[] buffer, byte[] assinado) throws Exception {

        Signature assinatura = Signature.getInstance(algoritmoAssinatura);
        assinatura.initVerify(chave);
        assinatura.update(buffer, 0, buffer.length);
        return assinatura.verify(assinado);
    }

    public static byte[] criarAssinatura(PrivateKey chavePrivada, byte[] buffer) throws Exception {

        Signature assinatura = Signature.getInstance(algoritmoAssinatura);
        assinatura.initSign(chavePrivada);
        assinatura.update(buffer, 0, buffer.length);
        return assinatura.sign();
    }

    public static String getValidade(X509Certificate cert) {
        try {
            cert.checkValidity();
            return "Certificado válido!";
        } catch (CertificateExpiredException e) {
            return "Certificado expirado!";
        } catch (CertificateNotYetValidException e) {
            return "Certificado inválido!";
        }
    }

    public static void getCertificado() throws Exception {
        InputStream dado = new FileInputStream(file);
        rep = KeyStore.getInstance("PKCS12");
        rep.load(dado, senha);
        cert = (X509Certificate) rep.getCertificate(alias);
        String retorno = TratadorCertificado.getValidade(cert);
        System.out.println(retorno);
    }

    public static void assinarDocumento(String localDocumento) throws Exception {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setNamespaceAware(true);
        Document doc = dbf.newDocumentBuilder().parse(new FileInputStream(localDocumento));
        System.out.println("Documento ok!");

        sig = XMLSignatureFactory.getInstance("DOM");

        ArrayList<Transform> transformList = new ArrayList<Transform>();
        Transform enveloped = sig.newTransform(Transform.ENVELOPED, (TransformParameterSpec) null);
        Transform c14n = sig.newTransform(C14N_TRANSFORM_METHOD, (TransformParameterSpec) null);
        transformList.add(enveloped);
        transformList.add(c14n);

        NodeList elements = doc.getElementsByTagName("infNFe");
        org.w3c.dom.Element el = (org.w3c.dom.Element) elements.item(0);
        String id = el.getAttribute("Id");
        Reference r = sig.newReference("#".concat(id), sig.newDigestMethod(DigestMethod.SHA1, null),
                transformList,
                null, null);
        si = sig.newSignedInfo(
                sig.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE,
                (C14NMethodParameterSpec) null),
                sig.newSignatureMethod(SignatureMethod.RSA_SHA1, null),
                Collections.singletonList(r));

        KeyInfoFactory kif = sig.getKeyInfoFactory();
        List x509Content = new ArrayList();
        x509Content.add(cert);
        X509Data xd = kif.newX509Data(x509Content);
        ki = kif.newKeyInfo(Collections.singletonList(xd));

        DOMSignContext dsc = new DOMSignContext(getChavePrivada(), doc.getDocumentElement());
        XMLSignature signature = sig.newXMLSignature(si, ki);
        signature.sign(dsc);
        OutputStream os = new FileOutputStream("assinado.xml");
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer trans = tf.newTransformer();
        trans.transform(new DOMSource(doc), new StreamResult(os));

    }

    public static void main(String[] args) {

        try {
            TratadorCertificado.getCertificado();
            TratadorCertificado.assinarDocumento("C:\\Documents and Settings\\Gilmar\\Desktop\\35090850559251000189550010000000010004001100-nfe.xml");
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

O melhor de tudo foi que eu não precisei criar nenhum keystore.

Nada como vasculhar o fórum!!!

Boa Tarde Pessoal!

Achei que já havia finalizado a NFe, porém apareceu mais um erro que não consigo resolver.
A SEFAZ do Paraná obriga que eu coloque o namespace na tag NFe, como abaixo:

1 (...)

mas quando eu assino meu documento e transformo ele de um objeto Document para um objeto String,
eu estou perdendo este namespace, e o meu documento xml está ficando assim

1 (...)

Alguém sabe o que pod estar acontecendo?

Tente assim a saida:

	ByteArrayOutputStream os = new ByteArrayOutputStream();
	TransformerFactory tf = TransformerFactory.newInstance();
	Transformer trans = tf.newTransformer();
	trans.transform(new DOMSource(doc), new StreamResult(os));
	return os.toString();  			

Alencar

É exatamente assim que eu estou fazendo…

será q não existe uma outra maneira, ou alguma propriedade que seja necessário setar, pois de acordo com a norma da w3c eu não posso ter tags com o mesmo namespace sem um prefixo, já que prefixos não são permitidos segundo o Layout da NFe, deve haver alguma coisa que eu tenho que fazer para poder ter namespaces repetidos, e aí, alguém arrisca?

Att.

Ernani C.S.,
Desenvolvimento - Joinville/SC

Opa…

Pessoal estou com problemas em me comunicar com o ws… nao consigo tirar o erro:
unable to find valid certification path to requested target

O procedimento que usei:

  1. Baixei o Associacao.pfx da SEFAZ;
  2. Importei usando o próprio JRE (javaws) e exportei o arquivo Associacao.cer;
  3. pelo keytool adicionei o .cer no CAcerts na pasta security do JRE.
  4. Setei as variaveis do sistema assim:
...
System.setProperty("javax.net.ssl.trustStoreType", "JKS");    
System.setProperty("javax.net.ssl.trustStore", "associa");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");    
System.setProperty("javax.net.ssl.keyStore", "C:\temp\Associacao.pfx");
System.setProperty("javax.net.ssl.keyStorePassword", "associacao");

strRetorno = soapServico.nfeStatusServicoNF(cabecMsg, consStatServ);
...
  1. To com o maledito erro:

Mesmo se tentar chamar os outros métodos do WS, recebo o mesmo erro. Estou usando o eclipse e ele ta configurado para usar o JDK1.5.

Olhei dentro da classe que chama o metodo e o link eh “http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico”… o de vocês esta assim tb ?

Preciso configurar algum certificado do WS na minha máquina ?

Vlw!


Progredi mais um pouco… (eu acho rs)

Acertei o keytool para o certificado (arquivo .cer), mas agora to com o seguinte erro:

Caused by: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty at java.security.cert.PKIXParameters.setTrustAnchors(PKIXParameters.java:183) at java.security.cert.PKIXParameters.<init>(PKIXParameters.java:103) at java.security.cert.PKIXBuilderParameters.<init>(PKIXBuilderParameters.java:87) at sun.security.validator.PKIXValidator.<init>(PKIXValidator.java:54) ... 30 more

O que errei na hora de setar os parâmetros ?

O problema é o certificado.
Você não vai conseguir conectar os servidores da receita federal com este certificado, é necessário um certificado válido. Peça ele aos seus clientes ou compre um e-CNPJ, como fizemos aqui na empresa.

Olhe no site da certisign e dos correios (nos correios é mais barato)… o processo demora em torno de 96 horas, entre a compra do certificado e a autorização de uso.

Informe-se…

Outro problema é relacionado ao trustStore
ele está incorreto

System.setProperty("javax.net.ssl.trustStoreType", "JKS"); System.setProperty("javax.net.ssl.trustStore", "associa"); System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

Pesquise sobre SSL e o que é um trustStore você vai aprender…
procure por isso: montar JKS em java…

Para montar este trustStore JKS é necessário baixar as chaves públicas (.cer) das SEFAZ que você
pretende enviar notas… depois é só colocar tudo neste trustStore.
Este trustStore são os certificado que você vai aceitar, assim como tem no IE (lista de certificado aceitos, quer dizer que aquelas pessoas são confiáveis).

Att.

Ernani C.S.,
Desenvolvimento - Joinville/SC
PPINFO ERP - Sistema Web de Gestão Empresarial
http://www.ppinfo.com.br

[quote=ernanics]O problema é o certificado.
Você não vai conseguir conectar os servidores da receita federal com este certificado, é necessário um certificado válido. Peça ele aos seus clientes ou compre um e-CNPJ, como fizemos aqui na empresa.

Olhe no site da certisign e dos correios (nos correios é mais barato)… o processo demora em torno de 96 horas, entre a compra do certificado e a autorização de uso.

Informe-se…

Outro problema é relacionado ao trustStore
ele está incorreto

System.setProperty("javax.net.ssl.trustStoreType", "JKS"); System.setProperty("javax.net.ssl.trustStore", "associa"); System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

Pesquise sobre SSL e o que é um trustStore você vai aprender…
procure por isso: montar JKS em java…

Para montar este trustStore JKS é necessário baixar as chaves públicas (.cer) das SEFAZ que você
pretende enviar notas… depois é só colocar tudo neste trustStore.
Este trustStore são os certificado que você vai aceitar, assim como tem no IE (lista de certificado aceitos, quer dizer que aquelas pessoas são confiáveis).

Att.

Ernani C.S.,
Desenvolvimento - Joinville/SC
PPINFO ERP - Sistema Web de Gestão Empresarial
http://www.ppinfo.com.br[/quote]

Cara… vlw as dicas… vou ver isso sim… principalmente a configuração dos .cer… que preciso deixar de um jeito bem flexivel…
Acho que consegui resolver essa parte… e me deparei com outro problema… que ai ja acho que o certificado que estou usando nao funciona…

postei minha duvida em outro post http://www.guj.com.br/posts/list/195/72325.java#723150 (são tantos de NFe que nem sei mais em qual postar… hehe).

Vlw


Mudei o código e agora ta me dando:

Modifiquei o codigo para:

[code]System.setProperty(“javax.net.ssl.trustStoreType”, “JKS”);
System.setProperty(“javax.net.ssl.trustStore”, keystore);
System.setProperty(“javax.net.ssl.trustStorePassword”, “changeit”);

System.setProperty(“javax.net.ssl.keyStoreType”, “PKCS12”);
System.setProperty(“javax.net.ssl.keyStore”, keystore);
System.setProperty(“javax.net.ssl.keyStorePassword”, “changeit”);
[/code]

No keystore coloquei os .cer do arquivo SEFAZSP_homologacao.p7b

=/