[RESOLVIDO] Erro ao enviar NFe

Boa tarde pessoal,

tenho um sistema de emissão de NFe que foi desenvolvido aqui na empresa,

estou com o seguinte erro ao tentar enviar a NFe para a receita do PR:

java.security.PrivilegedActionException: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Message send failed
21/11/2012 16:05:40 com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection post
GRAVE: SAAJ0009: Message send failed

entrei em contato com o pessoal da receita e me disseram que eu precisava atualizar a cadeia de certificados no qual me passaram um link para download dos mesmos … atualizei a cadeia de certificados e estou com o mesmo problema ainda…

segue o código que uso para o envio:

public synchronized void sendNFe(File file, File pfx, String senha){   
           
        String versao = "";   
           
        try{   
            FileReader fr = new FileReader(new File(file.getAbsolutePath().replace(".xml", "-assin.xml")));   
            BufferedReader br = new BufferedReader(fr);   
               
            String strAux = "";   
            String dados = "";   
               
            while ((strAux = br.readLine()) != null){   
                dados += strAux;   
            }   
               
            br.close();   
               
//          dados = dados.replace(" xmlns=\"http://www.portalfiscal.inf.br/nfe\"", "");   
            dados = dados.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>", "");   
//          dados = dados.replace("ns2:", "");   
//          dados = dados.replace(":ns2", "");   
               
            versao = dados.substring(dados.indexOf("versao=\"")+8, dados.indexOf("versao=\"")+12);   
               
               
            System.setProperty("javax.net.ssl.trustStoreType", "JKS");     
            System.setProperty("javax.net.ssl.trustStore", "jssecacerts");     
            System.setProperty("javax.net.ssl.trustStorePassword", "changeit");     
               
            if(!Var.isA3){   
                System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");     
                System.setProperty("javax.net.ssl.keyStore", pfx.getAbsolutePath());     
                System.setProperty("javax.net.ssl.keyStorePassword", senha);     
            }else{   
                Provider p = new SunPKCS11("token.cfg");   
                Security.addProvider(p);   
                KeyStore ks = KeyStore.getInstance("PKCS11");   
                ks.load(null, senha.toCharArray());   
                   
                System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");     
                System.setProperty("javax.net.ssl.keyStoreType",ks.getType());   
                System.setProperty("javax.net.ssl.keyStore", "NONE");   
                System.setProperty("javax.net.ssl.keyStorePassword", senha);   
            }   
               
            String enviNFe = "<enviNFe xmlns=\"http://www.portalfiscal.inf.br/nfe\" versao=\""+versao+"\"><idLote>000000000000001</idLote>"+dados+"</enviNFe>";   
               
            cabecMsg = "<cabecMsg xmlns=\"http://www.portalfiscal.inf.br/nfe\" "     
                     + "versao=\"2.00\">" + "<versaoDados>"+versao+"</versaoDados>"     
                     + "</cabecMsg>";   
               
               
            StringBuffer soapMessage = new StringBuffer();   
            soapMessage.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>")   
            .append("<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"")   
            .append(" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"")   
            .append(" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">")   
            .append("<soap12:Header>")   
            .append("<nfeCabecMsg xmlns=\"http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2\">")     
            .append("<versaoDados>2.00</versaoDados>")   
            .append("<cUF>41</cUF>")   
            .append("</nfeCabecMsg>")   
            .append("</soap12:Header>")   
            .append("<soap12:Body>")   
//          soapMessage.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")     
//          .append("<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"")   
//          .append(" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"")   
//          .append(" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">")   
//          .append("<soap12:Header>")   
//          .append(cabecMsg)   
//          .append("</soap12:Header>")   
//          .append("<soap12:Body>")   
            .append(enviNFe)   
            .append("</soap12:Body>")   
            .append("</soap12:Envelope>");   
           
               
            String response = metodo2(soapMessage.toString(), "https://nfe2.fazenda.pr.gov.br/nfe/NFeRecepcao2");   
  
               
            try{   
                FileWriter fw = new FileWriter(file.getAbsolutePath().replace(".xml", "-retEnviNFe.xml"));   
                BufferedWriter bw = new BufferedWriter(fw);   
                bw.write(response);   
                   
                bw.flush();   
                bw.close();   
                   
            }catch(Exception e){   
                JOptionPane.showMessageDialog(null, e.getMessage());   
                e.printStackTrace();   
            }   
               
        }catch(Exception e){   
            JOptionPane.showMessageDialog(null, e.getMessage());   
            e.printStackTrace();   
        }   
    }   
       
    public static String metodo2(String envelope, String urlAddress) {     
  
        try {     
            MessageFactory factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);     
            SOAPMessage message;     
  
            try {     
                MimeHeaders header = new MimeHeaders();     
                header.addHeader("Content-Type", "application/soap+xml");     
  
                message = factory.createMessage(header, new ByteArrayInputStream(envelope.getBytes()));     
                SOAPConnection con = SOAPConnectionFactory.newInstance().createConnection();     
  
                URL url = new URL(urlAddress);     
                System.out.println("Message enviada \n"+message);     
                SOAPMessage res = con.call(message, url);     
  
                ByteArrayOutputStream in = new ByteArrayOutputStream();     
                message.writeTo(in);     
                System.out.println("in :\n"+in.toString());     
  
                ByteArrayOutputStream out = new ByteArrayOutputStream();     
                res.writeTo(out);     
                System.out.println("out :\n"+desnormalizar(out.toString()));     
                return desnormalizar(out.toString());   
                   
            } catch (IOException ex) {   
                System.out.println("" + ex.getMessage());   
                return null;   
            }   
        } catch (SOAPException ex) {   
            System.out.println("" + ex.getMessage());   
            return null;   
        }   
    }   
  
    public static String desnormalizar(String texto) {     
        return texto.replace("<", "<").replace(">", ">").replace("''", "\"").replace("\n", "\r");     
    }  
public synchronized void sendNFe(File file, File pfx, String senha){
		
		String versao = "";
		
		try{
			FileReader fr = new FileReader(new File(file.getAbsolutePath().replace(".xml", "-assin.xml")));
			BufferedReader br = new BufferedReader(fr);
			
			String strAux = "";
			String dados = "";
			
			while ((strAux = br.readLine()) != null){
				dados += strAux; 
			}
			
			br.close();
			
//			dados = dados.replace(" xmlns=\"http://www.portalfiscal.inf.br/nfe\"", "");
			dados = dados.replace("<?xml version=\"1.0\" encoding=\"UTF-8\"?>", "");
//			dados = dados.replace("ns2:", "");
//			dados = dados.replace(":ns2", "");
			
			versao = dados.substring(dados.indexOf("versao=\"")+8, dados.indexOf("versao=\"")+12);
			
			
			System.setProperty("javax.net.ssl.trustStoreType", "JKS");  
			System.setProperty("javax.net.ssl.trustStore", "jssecacerts");  
			System.setProperty("javax.net.ssl.trustStorePassword", "changeit");  
			
			if(!Var.isA3){
				System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");  
				System.setProperty("javax.net.ssl.keyStore", pfx.getAbsolutePath());  
				System.setProperty("javax.net.ssl.keyStorePassword", senha);  
			}else{
				Provider p = new SunPKCS11("token.cfg");
				Security.addProvider(p);
				KeyStore ks = KeyStore.getInstance("PKCS11");
				ks.load(null, senha.toCharArray());
				
				System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");  
	            System.setProperty("javax.net.ssl.keyStoreType",ks.getType());
	            System.setProperty("javax.net.ssl.keyStore", "NONE"); 
	            System.setProperty("javax.net.ssl.keyStorePassword", senha);
			}
			
			String enviNFe = "<enviNFe xmlns=\"http://www.portalfiscal.inf.br/nfe\" versao=\""+versao+"\"><idLote>000000000000001</idLote>"+dados+"</enviNFe>";
			
			cabecMsg = "<cabecMsg xmlns=\"http://www.portalfiscal.inf.br/nfe\" "  
					 + "versao=\"2.00\">" + "<versaoDados>"+versao+"</versaoDados>"  
					 + "</cabecMsg>";
			
			
			StringBuffer soapMessage = new StringBuffer();
			soapMessage.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>")
			.append("<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"")
			.append(" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"")
			.append(" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">")
			.append("<soap12:Header>")
			.append("<nfeCabecMsg xmlns=\"http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2\">")  
			.append("<versaoDados>2.00</versaoDados>")
			.append("<cUF>41</cUF>")
			.append("</nfeCabecMsg>")
			.append("</soap12:Header>")
			.append("<soap12:Body>")
//			soapMessage.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>")  
//			.append("<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"")
//			.append(" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"")
//			.append(" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">")
//			.append("<soap12:Header>")
//			.append(cabecMsg)
//			.append("</soap12:Header>")
//			.append("<soap12:Body>")
			.append(enviNFe)
			.append("</soap12:Body>")
			.append("</soap12:Envelope>");
		
			
			String response = metodo2(soapMessage.toString(), "https://nfe2.fazenda.pr.gov.br/nfe/NFeRecepcao2");

			
			try{
				FileWriter fw = new FileWriter(file.getAbsolutePath().replace(".xml", "-retEnviNFe.xml"));
				BufferedWriter bw = new BufferedWriter(fw);
				bw.write(response);
				
				bw.flush();
				bw.close();
				
			}catch(Exception e){
				JOptionPane.showMessageDialog(null, e.getMessage());
				e.printStackTrace();
			}
			
		}catch(Exception e){
			JOptionPane.showMessageDialog(null, e.getMessage());
			e.printStackTrace();
		}
	}
	
	public static String metodo2(String envelope, String urlAddress) {  

		try {  
			MessageFactory factory = MessageFactory.newInstance(SOAPConstants.SOAP_1_2_PROTOCOL);  
			SOAPMessage message;  

			try {  
				MimeHeaders header = new MimeHeaders();  
				header.addHeader("Content-Type", "application/soap+xml");  

				message = factory.createMessage(header, new ByteArrayInputStream(envelope.getBytes()));  
				SOAPConnection con = SOAPConnectionFactory.newInstance().createConnection();  

				URL url = new URL(urlAddress);  
				System.out.println("Message enviada \n"+message);  
				SOAPMessage res = con.call(message, url);  

				ByteArrayOutputStream in = new ByteArrayOutputStream();  
				message.writeTo(in);  
				System.out.println("in :\n"+in.toString());  

				ByteArrayOutputStream out = new ByteArrayOutputStream();  
				res.writeTo(out);  
				System.out.println("out :\n"+desnormalizar(out.toString()));  
				return desnormalizar(out.toString());
				
			} catch (IOException ex) {
				System.out.println("" + ex.getMessage());
				return null;
			}
		} catch (SOAPException ex) {
			System.out.println("" + ex.getMessage());
			return null;
		}
	}

	public static String desnormalizar(String texto) {  
		return texto.replace("<", "<").replace(">", ">").replace("''", "\"").replace("\n", "\r");  
	}

alguém pode me dar uma luz de como resolver esse problema por favor

desde já grato

[quote=AlanRS]System.setProperty("javax.net.ssl.trustStore", "jssecacerts"); System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); [/quote]Essas linhas aí não estão erradas não?

Olá Rodrigo, obrigado por responder…

então essas linhas são as que setam nas propriedades do sistema o arquivo jssecacerts, eu acredito que não estão erradas, mas não tenho certeza … pois estou dando manutenção nesse sistema …

Vc tem alguma sugestão de como posso solucionar esse erro?

Novamente obrigado

Bom, o primeiro precisa ser o caminho do arquivo que possui a cadeia de certificados.
E o segundo tem que ser a senha que você configurou para esse arquivo.

Eu perguntei se estava errado de maneira irônica, mas na verdade eu sei que está errado. :slight_smile:

Humm … então pelo que vc falou agora acho que estou entendendo…

eu atualizei a cadeia de certificados … mas não atualizei esse arquivo jssecacerts … então … como posso fazer agora para atualiza-lo para que ele consiga enchergar os novos arquivos .cer que instalei ?

[quote=AlanRS]Humm … então pelo que vc falou agora acho que estou entendendo…

eu atualizei a cadeia de certificados … mas não atualizei esse arquivo jssecacerts … então … como posso fazer agora para atualiza-lo para que ele consiga enchergar os novos arquivos .cer que instalei ?[/quote]

O arquivo de cacerts não precisa enxergar o seu certificado digital. Se quiser gerar um arquivo para todos os estados, siga o tutorial abaixo:

http://www.javac.com.br/jc/posts/list/34-nfe-geracao-do-arquivo-cacerts-para-todos-os-estados-unico-arquivo.page

Rodrigo, obrigado pela ajuda e vou dar uma olhada no link que vc me passou,

só não entendi uma coisa … o arquivo cacerts não é o que contém a cadeia de certificados … se for isso … como eu atualizei essa cadeia de certificados incluindo mais alguns arquivos … esse arquivo cacerts estará desatualizado certo? (caso meu pensamento esteja errado me avise por favor)

então eu criando um novo arquivo cacerts com base nesse exemplo que vc me passou no link … automaticamente esse arquivo gerado estará atualizado correto …

é essa a logica para a atualização do cacerts??

novamente agradeço

Bom, você precisa ter todos os certificados. O cacert do estado para o qual você deseja emitir notas (no ambiente correto também, existe para homologação e para produção), e o seu certificado digital.

e então você adiciona os 2 nos parâmetros, com suas respectivas senhas, segue uma classe que eu fiz (boa parte copiada), para configurar isso:[code]package br.com.nfe;

import java.security.Security;

public class NFeSSL{

private static final String CAMINHO_ARQUIVO_CERTIFICADO = "Caminho do seu certificado .pfx";
private static final String SENHA_CERTIFICADO = "Senha do seu certificado digital";
private static final String CAMINHO_ARQUIVO_CACERTS = "Caminho do seu arquivo cacerts";

public static void configurar(){

	System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
	Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

	System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");

	System.clearProperty("javax.net.ssl.keyStore");
	System.clearProperty("javax.net.ssl.keyStorePassword");
	System.clearProperty("javax.net.ssl.trustStore");

	System.setProperty("javax.net.ssl.keyStore", CAMINHO_ARQUIVO_CERTIFICADO);
	System.setProperty("javax.net.ssl.keyStorePassword", SENHA_CERTIFICADO);

	System.setProperty("javax.net.ssl.trustStoreType", "JKS");
	System.setProperty("javax.net.ssl.trustStore", CAMINHO_ARQUIVO_CACERTS);
	
}

}[/code]Eu alterei um pouco, para omitir os meus dados. E eu uso um arquivo .properties também, para poder alterar o caminho sem ter que reiniciar o servidor.

Rodrigo, desculpe pela demora para responder.

Utilizei o exemplo de geração do arquivo cacerts que vc postou anteriormente, então instalei todos os certificados que constam no boletim informativo da receita estadual PR que constam neste link … http://boletim.fazenda.pr.gov.br/boletins/item/2012/29 … depois gerei novamente o arquivo cacerts e então funcionou tudo corretamente …

Não precisei mecher em nada do sistema … somente fazer a atualização do cacerts e a instalação dos novos certificados

Muito obrigado pela ajuda e pela paciência.

Abraço
Até

Opa, sem problemas :slight_smile:

É sempre bom ajudar alguém com esses problemas aí porque eu sei que pra achar a solução sozinho, pra quem não tem experiência com certificados ou serviços (como era o meu caso) dá uma baita dor de cabeça :smiley:

Obrigado mesmo … estava me dando uma enorme dor de cabeça aqui nossos clientes estavam desde ontem sem poder emitir notas por causa disso !!!..

É por causa de pessoas como vc que o fórum ganha a credibilidade que tem hj.

Novamente obrigado!