Assinaturas de arquivos xml da NFe

Pessoal,

Graças a muita leitura aqui no Forum, consegui gerar… assinar…e enviar uma NFe.

No momento estou enviando e recebendo um XML de resposta que apresenta a mensagem de sucesso:

Como eu faço agora para consultar essa nota fiscal enviada para o ambiente de homologação??

Existe algum site onde eu possao digitar a chave dela e ver como ela chegou até lá??

estou tentando no endereço a seguir, porem ele diz que a Nfe consultada não existe… será que estou consultando no endereço correto?

Vale lembrar que estou enviando para o ambiente de homologação ainda…

A validação do meu XML esta ok, conforme podem observar abaixo:

[code]Resultado da Validação do Schema e Conferência da Assinatura:

PARSER XML: OK
TIPO DE MENSAGEM: NF-e
SCHEMA: OK
ASSINATURA XML: Assinatura VÁLIDA[/code]

Obrigado pela respostas… sem dúvida irá me ajudar bastante.

Pessoal,

Acabei criando um método próprio para consultar o Status da NFe via webservice… e o resultado que obtenho é o seguinte:

Conferi o Estado do emitente no XML e esta correto, ou seja “SP”. O certificado também é de “SP”. O CNPJ do emitente é o mesmo do Certificado.

O que pode estar havendo??

Obrigado pela ajuda.

[quote=marpinheiro]Pessoal,

Acabei criando um método próprio para consultar o Status da NFe via webservice… e o resultado que obtenho é o seguinte:

Conferi o Estado do emitente no XML e esta correto, ou seja “SP”. O certificado também é de “SP”. O CNPJ do emitente é o mesmo do Certificado.

[/quote]

Código da UF é diferente de sigla da UF. Sigla = “SP”, código = “35”

Deve ser isso.

Alencar

É por no caso específico da Consulta de Notas Ficais você deve sempre consultar no Estado do Emitente.
Os dois primeiros digitos da Chave Representam o código do IBGE do Estado. Você deve então pela chave identificar qual é o código Estado, e consultar a nota do estado em que ela foi emitida.

Seguem os códigos

"UF"	"IBGE"
"AC"	12
"AL"	27
"AM"	13
"AP"	16
"BA"	29
"ES"	32
"MA"	21
"PB"	25
"PE"	26
"PI"	22
"RO"	11
"RR"	14
"TO"	17
"SP"	35
"CE"	23
"DF"	53
"GO"	52
"MG"	31
"MS"	50
"MT"	51
"PA"	15
"PR"	41
"RJ"	33
"RN"	24
"RS"	43
"SC"	42
"SE"	28

As URLS para cada estado, você encontra aqui:

http://www.nfe.fazenda.gov.br/portal/WebServices.aspx

ATENÇÃO: Isso se aplica apenas a Consulta, no caso de emissão você deve enviar sempre para o mesmo estado em que o seu certificado foi emitido.

Olá Senhores,

    Eu vi em outro tópico sobre a extração do dados do assinante com base no certificado, eu testei e funcionou, mas agora eu gostaria de saber se é possível extrair as mesmas informações do arquivo XML da NFe com base no conteúdo da tag X509Certificate ou X509Data ou qualquer coisas assim abaixo segue o código, eu estou obtendo apenas com o X509 imagino que precise da Signature também.
    No código abaixo o método test funciona e o testAlheio não, que é o que eu quero fazer funcionar.
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.KeyStore;
import java.security.PrivateKey;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.CertificateParsingException;
import java.security.cert.X509Certificate;
import java.util.Enumeration;
import java.util.List;
import org.bouncycastle.asn1.ASN1InputStream;
import org.bouncycastle.asn1.ASN1TaggedObject;
import org.bouncycastle.asn1.DERObject;
import org.bouncycastle.asn1.DERObjectIdentifier;
import org.bouncycastle.asn1.DEROctetString;
import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.asn1.DERString;

/**
 *
 * @author Murilo
 */
public class Main {

    private void testAlheio() throws CertificateException, IOException {
        String x509content = "conteudo da tag <509Certificate>";
        CertificateFactory fact = CertificateFactory.getInstance("X.509");
        ByteArrayInputStream bais = new ByteArrayInputStream(x509content.getBytes());
        while (bais.available() > 0) {
            X509Certificate x509 = (X509Certificate) fact.generateCertificate(bais);
            exibeCertificado(x509);
        }
        bais.close();
    }

    private void exibeCertificado(X509Certificate certificate) throws CertificateParsingException, IOException {
        for (List<?> subjectAlternativeName : certificate.getSubjectAlternativeNames()) {
            String email;
            Pair<DERObjectIdentifier, String> otherName;
            // O primeiro elemento é um Integer com o valor 0 = otherName, 1 = rfc822name etc.
            // O segundo valor é um byte array ou uma String. Veja o javadoc de
            // getSubjectAlternativeNames.
            switch (((Number) subjectAlternativeName.get(0)).intValue()) {
                case 0: // OtherName - contém CPF, CNPJ etc.
                    otherName = getOtherName((byte[]) subjectAlternativeName.get(1));
                    System.out.println("First : " + otherName.first);
                    System.out.println("Second : " + otherName.second);
                    // o OID fica em otherName.first
                    break;
                case 1: // rfc822Name - usado para email
                    email = (String) subjectAlternativeName.get(1);
                    System.out.println("email : "+email);
                    break;
                default:
                    break;
            }
        }
    }

    /**
     * Uma classe que encapsula pares de objetos.
     * Inspirado no template pair<> da STL.
     *
     * @param <T> O primeiro tipo.
     * @param <U> O segundo tipo.
     */
    class Pair<T, U> {

        /** O primeiro objeto. */
        public T first;
        /** O segundo objeto. */
        public U second;

        /** Construtor */
        public Pair(T t, U u) {
            first = t;
            second = u;
        }
    }

    /**
     * Interpreta um dado do tipo otherName.
     * Obs. O JDK 5.0 não tem classes que lidem com um dado do tipo OtherName.
     * É necessário usar o BouncyCastle.
     * @param encoded O dado em ASN.1.
     * @return Um par contendo o OID e o conteúdo.
     */
    private Pair<DERObjectIdentifier, String> getOtherName(byte[] encoded) throws IOException {
        // O JDK 5.0 não tem classes que lidem com um dado do tipo OtherName.
        // É necessário usar o BouncyCastle.
        ASN1InputStream inps = new ASN1InputStream(encoded);
        DERSequence seq = null;
        DERObjectIdentifier oid = null;
        String conteudo = "";
        seq = (DERSequence) inps.readObject();
        inps.close();
        Enumeration en = seq.getObjects();
        oid = (DERObjectIdentifier) en.nextElement();
        DERObject obj = ((ASN1TaggedObject) ((ASN1TaggedObject) en.nextElement()).getObject()).getObject();
        if (obj instanceof DERString) { // Certificados antigos SERASA - incorretos
            conteudo = ((DERString) obj).getString();
        } else if (obj instanceof DEROctetString) { // Certificados corretos
            conteudo = new String(((DEROctetString) obj).getOctets(), "ISO-8859-1");
        }
        return new Pair<DERObjectIdentifier, String>(oid, conteudo);
    }

//
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws CertificateParsingException, IOException, CertificateException {
//        new Main().test();
        new Main().testAlheio();
    }

    private void test() throws CertificateParsingException, IOException {
        File file = new File("CERT.pfx");
        X509Certificate certificate = null;

        if (file.exists()) {

//            CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
//            InputStream is = new FileInputStream(file);
//            Certificate certificate = certificateFactory.generateCertificate(is);
//            System.out.println("Tipo de certificado "+certificate.getType());
//            is.close();
            try {
                KeyStore keyStore = KeyStore.getInstance("PKCS12");
                InputStream is = new FileInputStream(file);
                String senha = "senha";
                keyStore.load(is, senha.toCharArray());
                is.close();

                String alias = "";

                PrivateKey privateKey = null;
                Enumeration e = keyStore.aliases();
                while (e.hasMoreElements()) {
                    alias = (String) e.nextElement();
                    certificate = (X509Certificate) keyStore.getCertificate(alias);
                    privateKey = (PrivateKey) keyStore.getKey(alias, senha.toCharArray());
                    System.out.println(certificate + " " + privateKey.getAlgorithm());
                }
            } catch (Exception ex) {
                ex.printStackTrace();
                System.out.println(ex.getCause());
            }
        } else {
            System.out.println("Certificado nao encontrado em " + file.getAbsolutePath());
        }
        exibeCertificado(certificate);
    }
}

[quote=julianosott]

ou seja, não pode ter o xmlns:ns2=“http://www.w3.org/2000/09/xmldsig#

o mesmo vale para o enviNFe:

<enviNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.10">
  <idLote>1</idLote> 
  <NFe xmlns="http://www.portalfiscal.inf.br/nfe">

nesse caso tanto o envi como cada nfe devem ter xmlns=“http://www.portalfiscal.inf.br/nfe” e o envi não pode ter o xmlns:ns2=“http://www.w3.org/2000/09/xmldsig#”. Se por acaso o xml estiver do jeito errado, pode usar esses códigos no assinador, ou criar outro método:

esse aqui remove o xmlns:ns2 do elemento raíz:

	doc.getDocumentElement().removeAttribute("xmlns:ns2");

esse aqui adiciona o xmlns necessário a tag NFe:

	((Element) doc.getDocumentElement().getElementsByTagName("NFe").item(i)).setAttribute("xmlns", "http://www.portalfiscal.inf.br/nfe");

Quem quiser verificar o xml pode usar esse site: http://www.sefaz.rs.gov.br/AAE_ROOT/NFE/SAT-WEB-NFE-VAL_1.asp Acho que ele só valida os certificados do Rio Grande do Sul, mas o bom é que ele verifica a estrutura do xml tb.

É isso por enquanto, qualquer coisa é só perguntar.[/quote]

Só para ajudar os próximos, essa solução ai em cima funcionou pra mim q estava com problema de assinatura, porém além disso também fiz:

		docs.getDocumentElement().removeAttribute("xmlns:ns2");
		docs.getDocumentElement().removeAttribute("xmlns:ds");
		docs.getDocumentElement().removeAttribute("xmlns:xsi");

funcionou direitinho depois q fiz isso

[quote=O Grande Bé][quote=julianosott]

ou seja, não pode ter o xmlns:ns2=“http://www.w3.org/2000/09/xmldsig#

o mesmo vale para o enviNFe:

<enviNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.10">
  <idLote>1</idLote> 
  <NFe xmlns="http://www.portalfiscal.inf.br/nfe">

nesse caso tanto o envi como cada nfe devem ter xmlns=“http://www.portalfiscal.inf.br/nfe” e o envi não pode ter o xmlns:ns2=“http://www.w3.org/2000/09/xmldsig#”. Se por acaso o xml estiver do jeito errado, pode usar esses códigos no assinador, ou criar outro método:

esse aqui remove o xmlns:ns2 do elemento raíz:

	doc.getDocumentElement().removeAttribute("xmlns:ns2");

esse aqui adiciona o xmlns necessário a tag NFe:

	((Element) doc.getDocumentElement().getElementsByTagName("NFe").item(i)).setAttribute("xmlns", "http://www.portalfiscal.inf.br/nfe");

Quem quiser verificar o xml pode usar esse site: http://www.sefaz.rs.gov.br/AAE_ROOT/NFE/SAT-WEB-NFE-VAL_1.asp Acho que ele só valida os certificados do Rio Grande do Sul, mas o bom é que ele verifica a estrutura do xml tb.

É isso por enquanto, qualquer coisa é só perguntar.[/quote]

Só para ajudar os próximos, essa solução ai em cima funcionou pra mim q estava com problema de assinatura, porém além disso também fiz:

		docs.getDocumentElement().removeAttribute("xmlns:ns2");
		docs.getDocumentElement().removeAttribute("xmlns:ds");
		docs.getDocumentElement().removeAttribute("xmlns:xsi");

funcionou direitinho depois q fiz isso[/quote]

Só reforçando o que o Grande Bé comentou no manual de integração da NFe fala que não é permitida a utilização de prefixos de namespace…XD

Só para atualizar… o validador via web para verificar os xmls do sefaz é http://www.sefaz.rs.gov.br/NFE/NFE-VAL.aspx não é mais o endereço antigo

Amigos do forum,

Eu sou programador em ambiente Mac Os X (amador).

Tenho rotinas escritas onde controle há anos em minha pequena empresa a emissão de notas fiscais, recebimentos e etc…

Com o surgimento da nota fiscal eletrônica, portei uma rotina que gera um arquivo em texto. (.txt) que uso na importação para o programa gratuito s]da Sefaz-SP, emissor gratuito de NFe.

Gostaria de melhorar minhas próprias rotinas para assinar e transmitir o .xml da NFe.

Creio que o primeiro passo seria assinar o XML.

Procuro ajuda, e estou de acordo em pagar por sua ajuda.

Alguém neste fórum poderia me ajudar escrevendo ou adaptando sua linha de código existente, para mim?

Pensei em ter um comando de terminal, que posso invocar de dentro de meu programa existente, que assinasse o arquivo de texto que sou capaz de gerar, mas não sou capaz de assinar.

Ou mesmo gravar numa pasta por exemplo: “Notas Fiscais por Assinar”, e uma rotina automática assinasse o xml e automáticamente gravasse cópia dele em outra pasta “Notas Fiscais Assinadas”.

Creio que não deve ser difícil para alguém que já tem suas rotinas prontas.

Aguardo contato,

Obrigado,

Bernardo Höhl

Usina Brasileira de Cristobalita Ltda
http://www.rutenium.com.br

Meu celular: 21-99775490

eu endereço de email é:

fundidor + arroba + mac.com

Pessoal, boa tarde.

Meu problema é o seguinte: Preciso saber como me monunicar com o webservice e enviar os dados da minha NF. eu já fiz a assinatura do xml, o que preciso saber é como enviar a nfe para a prefeitura.

vi alguns exemplos aqui mas não compreendi, pois eu tenho um keystore, um pfx, senha, o link, e o XMl. tudo isso deve ser passado como parâmetro(creio eu) na função que fará a comunicação com o webservice da prefeitura. se alguém puder me ajuda, grato pela atenção!

Olá Pessoal

Estou com problemas para validar a assinatura digital do XML de terceiros, sei que existe o próprio validador oferecido pelo governo, porem preciso fazer um que valide o XML também.

Tem alguns XML que eu NÃO consigo validar e a aplicação do governo valida.

Alguém tem algum exemplo de método de validação do XML assinado digitalmente?

Bah, um tutorial seria muito bacana! Aqui na empresa temos planos para implementar a NFe nos próximos e ter um artigo sobre isso feito por alguém que já teve problemas e conseguiu resolver seria de muita valia! Pois você já tem noção dos problemas encontrados nesse processo.[/quote]

Sou novo aqui, estou começando um projeto para criar componentes para NFe de campinas está faltando somente a assinatura do XML, você tem algum código fonte java com exemplo de como assinar a NFSe.

Jpleiser você está tentando assinar Nfe 1.10 ou 2.0?

[]'s

Pessoal, tem alguns xml de distribuição (xml de fornecedor) que estão vindo com namespace na tag nfeProc, tipo assim:

Isso invalida a assinatura do arquivo. Mas, estranhamento ao validar o conteúdo no site da SEFAZ/RS (http://www.sefaz.rs.gov.br/NFE/NFE-VAL.aspx)
valida certo.

O correto da tag seria assim, validando a assinatura corretamente.

Pergunto: alguém saberia como fazer na validação para ignorar/remover estes atributos?

Alencar

A tag que contem a assinatura é a NFe

drcosta, tô sabendo. Mas estranhamente a assinatura se torna inválida só por conter os atributos na
tag nfeProc, que nem é usada na validação da assinatura…

Muito louco isso.

Alencar

Pessoal, estou com um problema de validação de assinatura, quando o certificado usado foi um NF-e (não é e-CNPJ).
Este tipo de certificado existe e é aceito pela SEFAZ para assinatura de NF-e.
Porém, no meu código de validação, retorna falso para a cadeia validadora. Já me certifiquei para a existência dos
certificados no certs.
Se desabilito a verificação da cadeia, a assinatura é validada ou seja, a assinatura em si está correta.
Estou em voltas com um certificado emitido por
– Autoridade Certificadora Raiz Brasileira v2
|-- AC Certisign G6
|-- AC Certisign Multipla G5

fornecedor: http://www.certisign.com.br/atendimento-suporte/downloads/hierarquias/icp-brasil/nf-e#.UTZTuZ5QCZx

Alguma dica de como validar esta cadeia? Algo diferente neste tipo de certificado que mude o algorítimo de validação
na classe X509KeySelector?

Grato a todos pela atenção.