Nfe - Nota Fiscal Eletronica

[quote=gersonlange]Bom, estou voltando ao desenvolvimento da NF-e e estou com um problema realmente estranho.
Estou utilizando um certificado do tipo A3.
Gero o xml, assino já td certo.
Mas qdo vou gerar a comunicação com o Webservice do Rio Grande do Sul utilizando a ferramenta WSDL2Java do Axis ocorre o erro:

Isto, no caso, retorna que nao tenho permissão de acesso.

Obrigado[/quote]

fera, o seu token.cfg está apontando pra dll certa do seu token/leitor?

Bom a principio sim, pois esta assinando o xml corretamente e usando o debug:

está listando no console os dados do certificado corretamente.

entro do token.cfg tenho

name = SmartCard library = c:/windows/system32/aetpkss1.dll

Há algum modo para mim saber qual eh a dll certinha que o token usa? Pois este código achei em outro tópico. Estou usando o GemPC Twin

Desde já agradeço…

fala f-schmitt, blz?

então cara, esse skema de limpar o properties nao deu certo…nao aconteceu nada de diferente…mas tipo, eu nao estou usando o “System.setProperty(“javax.net.ssl.keyStorePassword, senha”)” no meu código, então nao tem nada para limpar, certo? o estranho é q acontece o seguinte:

eu tentei colocar um try-catch direto no meu ks.load(…), aí, se digito a primeira senha errada, ele cai no catch…porém, se digito uma certa (ele nao entra no catch) e em seguida uma errada, o catch nao pega essa senha errada, e tipo, eu gravo a senha logo antes do ks.load e e ela ta com a senha errada, só q o ks.load carrega msm assim…não sei mais o q fazer…acho q ja decorei todos os tópicos do assunto na net de tanto procurar e nao consigo resolver…minha esperança agora é alguem me ajudar… :?

vou postar meu código completo aki…quem puder dar uma olhada e ver se tem alguma coisa q eu possa fazer, fico muito grato…

[code]import java.io.;
import java.security.
;
import java.security.cert.;
import java.security.cert.X509Certificate;
import java.util.
;
import javax.crypto.*;
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.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;

public class Nfe
{
public Nfe()
{
}

public static String assinarEnviNfe(String xmlNaoAssinado, String uri, int tipo, String certificadoPath, String certificadoSenha, String CaminhoDLL, String NoPaiAssinatura)
    throws Exception
{
    try {
        xmlNaoAssinado = xmlNaoAssinado.replaceAll("\t", "");
        xmlNaoAssinado = xmlNaoAssinado.replaceAll("\n", "");
        xmlNaoAssinado = xmlNaoAssinado.replaceAll("\r", "");
        //define uma nova instancia DOM
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        //indica que essa nova instancia irá aceitar NameSpaces
        factory.setNamespaceAware(true);
        //cria uma nova instancia de um DocumentBuilder (obtem um documento XML DOM)
        DocumentBuilder builder = factory.newDocumentBuilder();
        //parse = Analisar o conteúdo de um determinado arquivo como um documento XML e retornar um novo DOM
        //ByteArrayInputStream = Separa uma string em fluxo de bytes
        Document doc = builder.parse(new ByteArrayInputStream(xmlNaoAssinado.getBytes()));
        //fábrica para criar objetos XMLSignature baseado no DOM
        XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");
        //cria uma lista de Array
        ArrayList transformList = new ArrayList();

        // Cria a lista de tranformações a serem aplicadas as referencias a
       // serem assinadas (transformaçoes exigidas pela w3c)
        javax.xml.crypto.dsig.spec.TransformParameterSpec tps = null;
        javax.xml.crypto.dsig.Transform envelopedTransform = fac. newTransform("http://www.w3.org/2000/09/xmldsig#enveloped-signature", tps);
        javax.xml.crypto.dsig.Transform c14NTransform = fac.newTransform("http://www.w3.org/TR/2001/REC-xml-c14n-20010315", tps);
        transformList.add(envelopedTransform);
        transformList.add(c14NTransform);

        KeyStore ks = null;
            java.security.Provider p = null;

            if(tipo == 1) //significa que é certificação tipo A1
            {
                // cria uma instancia de um keystore de um tipo específico
                ks = KeyStore.getInstance("PKCS12");
                // carrega um keystore existente
                //try {
                    ks.load(new FileInputStream(certificadoPath), certificadoSenha.toCharArray());
                //} catch(Exception e){
                //    return "Caminho ou Senha Inválido(a)!";
                //}
            } else //significa que é certificação tipo A3
            {
                p = new sun.security.pkcs11.SunPKCS11(CaminhoDLL);
                Security.addProvider(p);
                // cria uma instancia de um keystore de um tipo específico
                ks = KeyStore.getInstance("pkcs11");
                // carrega um keystore existente
                //try {
                    ks.load(null, certificadoSenha.toCharArray());
                //} catch(Exception e){
                    //return "Caminho ou Senha Inválido(a)!";
                //}
            }                

        //variavel segura para armazenar a chave primaria
        KeyStore.PrivateKeyEntry pkEntry = null;

        //enumera todos os Aliases contidos no keyStore
        Enumeration aliasesEnum = ks.aliases();

        //agrupa todas as chaves privada em uma unica variavel
        PrivateKey privateKey = null;
        //loop de todos os Aliases
        while(aliasesEnum.hasMoreElements())
        {
            //salva o Alias na variavel "alias" como String
            String alias = (String)aliasesEnum.nextElement();

            //verifica se a chave primaria é valida
            if(ks.isKeyEntry(alias))
            {
                //obtem a chave primaria do alias selecionado
                pkEntry = (KeyStore.PrivateKeyEntry)ks.getEntry(alias, new java.security.KeyStore.PasswordProtection(certificadoSenha.toCharArray()));
                // armazena a chave numa variavel de grupo de chaves
                privateKey = pkEntry.getPrivateKey();
                break;
            }
        }

        //cria uma instancia do tipo X509Certificate
        //X509Certificate - classe que proporciona uma forma padrao de acesso
        // a todos os atributos do certificado
        X509Certificate cert = (X509Certificate) pkEntry.getCertificate();

        //Um KeyInfo contém uma lista de XMLStructures, cada um dos quais
        //contêm informações que permite ao destinatário obter
        //a chave necessária para validar uma assinatura XML
        KeyInfoFactory kif = fac.getKeyInfoFactory();
        //cria uma lista (tipo vetor)
        List x509Content = new ArrayList();
        // adiciona o certificado a lista
        x509Content.add(cert);

        //cria um elemento contendo identificador de uma lista especifica do certificado
        javax.xml.crypto.dsig.keyinfo.X509Data xd = kif.newX509Data(x509Content);
        //retorna uma lista imutavel de objetos especificos
        KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));
        //chama metodo "assinarNfe"
        assinarNfe(fac, transformList, privateKey, ki, doc, uri, NoPaiAssinatura);

        ByteArrayOutputStream os = new ByteArrayOutputStream();
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer trans = tf.newTransformer();
        Properties prop = trans.getOutputProperties();
        prop.put("omit-xml-declaration", "yes");
        trans.setOutputProperties(prop);
        trans.transform(new DOMSource(doc), new StreamResult(os));
        String xmlFinal = os.toString();
        xmlFinal = xmlFinal.replaceAll("\t", "");
        xmlFinal = xmlFinal.replaceAll("\n", "");
        xmlFinal = xmlFinal.replaceAll("\r", "");

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

        if(tipo == 2)
            Security.removeProvider(p.getName());
        
        return xmlFinal;

    } catch (UnrecoverableEntryException ex) {
     //ex.printStackTrace();
     return '0' + ex.getMessage();            
    } catch (CertificateException ex) {
     //ex.printStackTrace();
     return '1' + ex.getMessage();
    } catch (java.security.KeyStoreException ex) {
     //ex.printStackTrace();
     return '2' + ex.getMessage();            
    } catch (Exception ex) {
        String mensagemErro = ex.getMessage();
        ex.printStackTrace();
        if (tipo == 1)
          if(mensagemErro.equalsIgnoreCase("stream does not represent a PKCS12 key store"))
              return "O arquivo selecionado n\343o \351 um arquivo de certificado v\341lido.";
          else if(mensagemErro.indexOf("wrong password or corrupted file") != -1)
              return "A senha informada est\341 incorreta ou o arquivo foi corrompido.";
          else
              return "Erro carregando certificado de arquivo.\nErro:[" + mensagemErro + "]";
        else
            return "Erro carregando certificado do tipo A3";            
    }
}

//escreve o XML contendo a assintatura
private static void assinarNfe(XMLSignatureFactory fac, ArrayList transformList, PrivateKey privateKey, KeyInfo ki, Document doc, String uri, String NoPaiAssinatura)
    throws Exception
{
    //cria um elemento referenciando o atributo Id do arquivo XML
    //cria também um elemento digestmethod
    javax.xml.crypto.dsig.Reference ref = fac.newReference(uri, fac.newDigestMethod("http://www.w3.org/2000/09/xmldsig#sha1", null), transformList, null, null);
    javax.xml.crypto.dsig.spec.C14NMethodParameterSpec  nullspec = null;
    javax.xml.crypto.dsig.CanonicalizationMethod can = fac.newCanonicalizationMethod("http://www.w3.org/TR/2001/REC-xml-c14n-20010315", nullspec);
    javax.xml.crypto.dsig.SignedInfo si = fac.newSignedInfo(can, fac.newSignatureMethod("http://www.w3.org/2000/09/xmldsig#rsa-sha1", null), Collections.singletonList(ref));
    XMLSignature signature = fac.newXMLSignature(si, ki);
    DOMSignContext dsc = new DOMSignContext(privateKey, doc.getElementsByTagName(NoPaiAssinatura).item(0));
    signature.sign(dsc);
}

public static String transmiteNFe(String caminhoDLLouCFG, String certificadoSenha, String pkcs)
        throws Exception
{
    try
    {
        KeyStore ks = null;
        Provider p;
        if (pkcs.equals("pkcs12")) {
            System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
            p = new com.sun.net.ssl.internal.ssl.Provider();
            Security.addProvider(p);
            ks = KeyStore.getInstance("pkcs12");
            ks.load(new FileInputStream(caminhoDLLouCFG), certificadoSenha.toCharArray());
        }
        else
        {
            p = new sun.security.pkcs11.SunPKCS11(caminhoDLLouCFG);
            Security.addProvider(p);
            ks = KeyStore.getInstance("pkcs11");
            ks.load(null,certificadoSenha.toCharArray());
        }

        System.setProperty("javax.net.ssl.keyStoreType",pkcs);
        System.setProperty("javax.net.ssl.keyStorePassword", certificadoSenha);
        System.setProperty("javax.net.ssl.trustStoreType","JKS");
        System.setProperty("javax.net.ssl.trustStore","C:/TSCerts");
        System.setProperty("javax.net.ssl.trustStorePassword", "123456");
        return "";
    }
    catch(Exception e)
    {
      String mensagemErro = e.getMessage();
      e.printStackTrace();
      if(mensagemErro.equalsIgnoreCase("stream does not represent a PKCS12 key store"))
          return "O arquivo selecionado n\343o \351 um arquivo de certificado v\341lido.";
      else if(mensagemErro.indexOf("wrong password or corrupted file") != -1)
          return "A senha informada est\341 incorreta ou o arquivo foi corrompido.";
      else
          return "Erro carregando certificado de arquivo.\nErro:[" + mensagemErro + "]";
    }
}

}
[/code]

Se for útil para alguem, ta funcionando (tirando o detalhe da senha)…tem até uns comentário mais ou menos só pra entender alguma coisinha…

bom, espero que alguem possa me ajudar…

Obrigado…

Opa… tb to voltando a mexer com a NFe… parei um tempo por causa das “prioridades”… ^^

Enfim… parei na geração do XML e assinatura… agora to na parte de comunicação com a SEFAZ… ja peguei os WSDL no site da fazenda e ja gerei os Java com eles…

Ja tenho a chamada aos métodos… e o primeiro é

… que recebe 2 parâmetros… to procurando no manual o conteudo desses parâmetros… mas se alguem tiver um exemplo de chamada… seria de grande ajuda… Vi que tem um CabecMsg nos XSD… eh por ai o caminho ??

Vlw !!!

********************** (aproveitando o post)
Bom… consegui gerar o Cabec e Dados através dos XSD (criei classes correspondentes).
Agora estou parado em outro erro… o “unable to find valid certification path to requested target”

Se mais agluém estiver com problemas nessa parte, o seguinte post tem mais informações
http://www.guj.com.br/posts/list/90/83758.java#725070


Acertei esse… bom… nao sei se eh o correto e se alguem usaou uma solução melhor… por favor nos avise… hehe
A solução foi colocar o caminho completo do KeyStore… ao inves de deixar so o alias de um dos certificados nele…

Mas agora cai em outro erro…:

Me parece ser alguma configuração no borwser, como certificados de outras pessoas etc… vou tentar aki e já aviso vcs…


Analisei com mais calma esse 403 e eh um retorno HTML… pedindo para configurar o Browser com o certificado… o problema eh que tenho dois… o FIrefox e o IE, ja joguei nos dois… e nada… =/

(copie e salve em um aruqivo html para ficar mais clara a mensagem)

[code]!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

The page requires a client certificate BODY { font: 8pt/12pt verdana } H1 { font: 13pt/15pt verdana } H2 { font: 8pt/12pt verdana } A:link { color: red } A:visited { color: maroon }

The page requires a client certificate

The page you are attempting to access requires your browser to have a Secure Sockets Layer (SSL) client certificate that the Web server will recognize. The client certificate is used for identifying you as a valid user of the resource.

Please try the following:

  • Contact the Web site administrator if you believe you should be able to view this directory or page without a client certificate, or to obtain a client certificate.
  • If you already have a client certificate, use your Web browser's security features to ensure that your client certificate is installed properly. (Some Web browsers refer to client certificates as browser or personal certificates.)

HTTP Error 403.7 - Forbidden: SSL client certificate is required.
Internet Information Services (IIS)


Technical Information (for support personnel)

  • Go to Microsoft Product Support Services and perform a title search for the words HTTP and 403.
  • Open IIS Help, which is accessible in IIS Manager (inetmgr), and search for topics titled About Certificates, Using Certificate Trust Lists, Enabling Client Certificates, and About Custom Error Messages.
[/code]

Fui !

Bom… entei acessar o WS via browser e acabei caindo no mesmo erro acima… =/

O endereço que usei foi:
https://homologacao.nfe.fazenda.sp.gov.br/nfeweb/services/nfestatusservico.asmx

Ai ele me pediu um certificado (IE) adicionei uma exceção no FireFox… mas não rolou…

Já baixei aquele SEFAZSP_homologacao.p7b e instalei nos dois browser’s… e nada… na minha aplicação usei o keytool para importar os certificados extraidos do SEFAZSP_homologacao.p7b para dentro de meu arquivo cacerts…

Também importei nos browser o Associacao.pfx… na aplicação usei tb usei o keytool para importa-lo…

Onde estou errando na hora de importar os certificados publicos da SEFAZ ou o meu privado ???

vlw !

Apenas para reforçar o que já foi dito no fórum em outros post’s.

http://forum.imasters.uol.com.br/index.php?/topic/350600-resolvido%26nbsp%3Bnf-e-como-instalar-um-certificado-para-o-ambiente-de/

E quem ainda não se convenceu, aconselho tentar acessar o link:
https://www.sefazvirtual.fazenda.gov.br/NFeStatusServico/NFeStatusServico.asmx

Ou qualquer outro que precise do certificado.

Fui !

Gente, seguinte, consegui ENFIM conectar com o webservice do status servico e consulta cadastro. Mas para o consulta cadastro tem um problema, por exemplo estou utilizando Sefaz SP, mas dai so consigo consultar para clientes SP, qq outro estado recebo o erro “265 Rejeição: Sigla da UF da consulta difere da UF do Web Service”, pois teoricamente teria q usar o webservice de cada estado na procura.
Nao q eu concorde com isso, mas blz, nao tem jeito, bola pra frente. Agora percebi q na listagem dos webservices varios estados nao possuem o webservice para consultacadastro. Para esses casos, alguma ideia ??
E peguei um exemplo de um estado q possui e tentei chegar, mas dai tenho erro de certificado, pois so tenho o certificado raiz do sefaz SP, alguem sabe como consigo dos outros estados ??
E alguem ja desenvolveu o consulta cadastro para varios estados ??

Grato,
Magno
magno_jr@terra.com.br

Pessoal, alguém está utilizando o serviço de “Consulta Cadastro” (consCad)…
Só falta este serviço, e em SP não deu… estou puxando os de RS agora para fazer novos testes manhã…

VALEU!

O erro que dá é este:

... Server was unable to process request. ---> Object reference not set to an instance of an object. ...

Endereço da tentativa:

Ola, eu estava com esse problema tbm, mas comigo era erro de versao do xml.
Utilize versao 1.01 no cabecalho e no “corpo”.

Magno

Cara, você tem o exemplo de XML que você está mandando? Pode ser só os dados, sem o cabeçalho!
NO Cabeçalho tem:

  • Versao Dados;
  • Versaso;

Quais são os valores para estes atributos?

Exemplo da Consulta de Cadastro:

<?xml version="1.0" encoding="UTF-8"?>
<ConsCad xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.01">
<infCons>
<xServ>CONS-CAD</xServ>
<UF>SP</UF>
<IE>123456789012</IE>
</infCons>
</ConsCad>

Magno

Olha issso:

Cabeçalho:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cabecMsg versao="1.01" xmlns="http://www.portalfiscal.inf.br/nfe">
  <versaoDados>1.10</versaoDados>
</cabecMsg>

Corpo:

<?xml version="1.0" encoding="UTF-8"?>
<consCad xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.01">
  <infCons>
    <xServ>CONS-CAD</xServ>
    <UF>RS</UF>
    <IE>113418659116</IE>
    <CNPJ>67808881000142</CNPJ>
   </infCons>
</consCad>

Erro do Retorno da Receita:

242 - Rejeicao: Cabecalho - Falha no Schema XML

Eu uso o mesmo código e cabeçalho para outros serviços e todos estão funcionando corretamente… Só agora que está me incomodando!

no cabecalho a versao esta errada:

1.01

Bem agora passou, ficou no meu XML… mas beleza agora me viro:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cabecMsg versao="1.02" xmlns="http://www.portalfiscal.inf.br/nfe">
<versaoDados>1.01</versaoDados>
</cabecMsg>

Valeu ae Magno!!!

Tava lendo a documentação sobre os campos de nf-e para a tabela de produtos:
http://www.emissornfehom.fazenda.sp.gov.br/docs/[Emissor_NF-e]_Manual_de_layout_TXT_e_XML-Cadastros_v1.0.3.pdf

E deparei com alguns campos da qual não tenho conhecimento algum:
Vamos trocar uma idéia e quem sabe tbm ajudar outras pessoas que estão passando por isso:

Cadastro de Produtos

1-EAN = seria o código de barras certo?
EAN Unid. tributável = seria o código de barras do produto tributável?! mas qual a diferença em relação a somente o código EAN?

2- Unid. Com. = unidade comercial, seria a unidade que compra? a unidade que vende?
Unid. Trib. = unidade tributável, certo, porém a mesma pergunta acima, seria a unidade de compra ou venda? qual a diferença entre as duas?

3- Qtde. Trib. = seria a quantidade em estoque?

4- Valor Unid. Com. e Valor Unid. Trib. = seriam os valores de venda pro cliente final? qual a diferença entre as duas?

Entao, so estou falando o q estou preenchendo no lugar (o q me passaram), mas nao posso te dar certeza absoluta q isso é o 100% correto.
1-EAN Codigo de barras = codigo EAN13 do codigo de barras mesmo
EAN Unid. tributável = como possui 14 digitos, estou colocando no lugar o meu codigo do produto DUM14, q é na verdade o EAN13+digito verificador

2, 3 e 4: das qtdades e valores comercial e tributarias ninguem conseguiu me dizer a diferenca, mas todos disseram pra eu preencher as 2 iguais.

Abracos,
Magno
magno_jr@terra.com.br

Em determinadas situações a empresa tributa qtdade ou valor diferente do que fatura, o layout está preparado p/ isso, em situações normais é só colocar os dois iguais.

Quanto ao EAN, estou colocando os dois campos iguais EAN13

abraço

Pessoal sei que todos estao indo no rumo do xml…porém…

No proprio software da nFE existe a possibilidade de importar o os arquivos xml ou txt. O XML esta certo, porem nao consigo importar o txt para ele… tem alguma coisa “diferente” na importação?

somente pro parana tenho essa menssagem alguem passou por isso ?



<?xml version="1.0" encoding="UTF-8" standalone="yes"?><consReciNFe versao="1.10" xmlns="http://www.portalfiscal.inf.br/nfe"><tpAmb>2</tpAmb><nRec>410000003330114</nRec></consReciNFe>Porta SOAP que esta sendo invocada: JAX-WS RI 2.1.1 in JDK 6: Stub for https://homologacao.nfe.fazenda.pr.gov.br/NFENWebServices/services/nfeRetRecepcao
Resposta do servico: null
java.lang.NullPointerException
        at java.io.StringReader.<init>(StringReader.java:33)
        at nfewebservice.NfeRetRecepcaoCLiente.teste(NfeRetRecepcaoCLiente.java:92)
        at nfewebservice.Main.main(Main.java:16)

eu envio o lote e dia que esta ok, mas a consulta é sempre nulo, alguem sabe ?
detalhe, só acontece pro Parana, demais regioes esta ok.

Em PIS e COFINS, vcs estão colocando os campos de ST (Substituição Tributária)? Por que? É Realmente necessário?
Se sim, vai ficar campo d+.